我正在使用 BroadcastReceiver 在我的应用程序中检查 Internet 连接,如果连接丢失,我会显示一个警报对话框。它工作正常。但我的问题是,即使我的应用程序处于后台,BroadcastReceiver 也能正常工作。因此,即使用户在其他应用程序中,当互联网连接丢失时也会弹出对话框。这完全毁了我的应用程序。
有人知道如何仅在应用程序中限制广播接收器吗?
这是我的广播接收器:
public class ConnectivityChangedReceiver extends BroadcastReceiver{
@Override
public void onReceive( Context context, Intent intent )
{
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
} else {
try{
Intent i=new Intent(context, InternetDialogActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
} catch(Exception e){
e.printStackTrace();
}
}
}
}
Activity 是:
public class InternetDialogActivity extends Activity implements OnClickListener{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.internet_dialog_box);
getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
Button retryButton = (Button) findViewById(R.id.retryInternetButton);
retryButton.setOnClickListener(this);
}
public boolean checkConnectivity(){
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo!=null && networkInfo.isConnected()) {
finish();
return true;
} else {
Intent intent = getIntent();
finish();
startActivity(intent);
return false;
}
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.retryInternetButton:
try{
checkConnectivity();
} catch(Exception e){
e.printStackTrace();
}
break;
}
}
}
这是我在 list 中声明接收者和 Activity 的方式:
<receiver android:name="com.lisnx.service.ConnectivityChangedReceiver"
android:label="NetworkConnection">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<activity android:name="com.lisnx.activity.InternetDialogActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.Dialog" />
我读到我们可以通过不在 list 中声明来限制 BroadcastReceiver 在应用程序中工作。但我不知道接收器将如何工作?请帮我。我被严重困住了。提前谢谢。
最佳答案
一个 BroadcastReceiver
当应用程序在后台时工作,因为接收器拾取的事件是全局发送的,并且每个应用程序都注册以监听这些事件,无论它是否正在运行。
为了解决这个问题,在您的 BroadcastReceiver
的 onReceive
代码中,检查您的应用是否在前台。
有一种——也是我所知道的唯一一种——始终如一地有效的方法来做到这一点。您需要跟踪应用程序的暂停/恢复操作。确保您在每个 Activity 中检查这一点。
有一些示例代码 in this answer (解决方案#1)。在您的情况下,您需要在从 BroadcastReceiver
执行任何操作之前检查 MyApplication.isActivityVisible() == true
作为验证。
关于android - 为什么即使应用程序处于后台,BroadcastReceiver 也能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274997/