android - 为什么即使应用程序处于后台,BroadcastReceiver 也能正常工作?

标签 android broadcastreceiver manifest

我正在使用 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当应用程序在后台时工作,因为接收器拾取的事件是全局发送的,并且每个应用程序都注册以监听这些事件,无论它是否正在运行。

为了解决这个问题,在您的 BroadcastReceiveronReceive 代码中,检查您的应用是否在前台。

有一种——也是我所知道的唯一一种——始终如一地有效的方法来做到这一点。您需要跟踪应用程序的暂停/恢复操作。确保您在每个 Activity 中检查这一点。

有一些示例代码 in this answer (解决方案#1)。在您的情况下,您需要在从 BroadcastReceiver 执行任何操作之前检查 MyApplication.isActivityVisible() == true 作为验证。

关于android - 为什么即使应用程序处于后台,BroadcastReceiver 也能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274997/

相关文章:

.net - "asInvoker"和 "highestAvailable"执行级别有什么区别?

Android:确定是否收到广播

android - 关闭来自 BroadCastReceiver 的通知

java - 联系人android应用程序开发

java - 哪个更有效率

android - 在android中使用广播接收器的电话状态监听器不工作

java - 直接在Eclipse中运行源代码即可。为什么 Jar 文件将停止运行并且控制台中没有异常显示?

ios - Web 应用程序缓存 iOS

java - volley.parsererror :org. json.JSONException : value br of type java. lang.string 无法转换为 JSONObject

android - 三星齿轮配套应用深层链接