首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么即使在后台,BroadcastReceiver也能正常工作?

为什么即使在后台,BroadcastReceiver也能正常工作?
EN

Stack Overflow用户
提问于 2012-09-05 13:30:45
回答 6查看 45.1K关注 0票数 19

我正在使用BroadcastReceiver检查我的应用程序中的互联网连接,如果连接丢失,我会显示一个警告对话框。它工作得很好。但我的问题是,即使我的应用程序处于后台,BroadcastReceiver也能正常工作。因此,即使用户在其他应用程序中,当互联网连接丢失时,也会弹出对话框。这完全毁了我的应用。

有没有人知道如何在应用程序中限制广播接收器?

这是我的BroadcastReceiver:

代码语言:javascript
复制
 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();
        }
    }
  }
}

活动是:

代码语言:javascript
复制
 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;
       }
   }
   }

下面是我如何在清单中声明接收器和活动的:

代码语言:javascript
复制
  <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" />

我读到过,我们可以通过不在清单中声明BroadcastReceiver来限制它在应用程序中工作。但我不知道接收器是如何工作的?请帮帮我。我被它卡住了。提前谢谢。

EN

回答 6

Stack Overflow用户

发布于 2012-09-05 13:58:20

您是否已尝试从清单中删除意图过滤器,并在活动中注册/注销它?因此,您可以尝试在onStart()中注册意图过滤器,并在onStop()方法中取消注册它。代码是这样想的:

代码语言:javascript
复制
static final String ACTION = "android.net.conn.CONNECTIVITY_CHANGE";


IntentFilter filter = new IntentFilter(ACTION);
this.registerReceiver(ConnectivityChangedReceiver, filter);


unregisterReceiver(ConnectivityChangedReceiver);

如果你还不熟悉Activity Lifecycle,你也应该学习它。

票数 17
EN

Stack Overflow用户

发布于 2012-09-05 16:32:33

您应该在每个活动的onPause()onResume()中注册/注销您的BroadcastReceiver。然后你就会知道,只有当你的应用程序在前台时,接收器才会“监听”。您可以通过创建自己的BaseActivity轻松做到这一点,它扩展了Activity,覆盖了onPause()onResume(),并注册/注销您的接收器。只需让您的所有活动像往常一样扩展BaseActivity并让它们调用super.onResume()super.onPause()即可。示例代码如下:

代码语言:javascript
复制
public class BaseActivity extends Activity {
    // Create an IntentFilter to listen for connectivity change events
    static IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
    // Create an instance of our BroadcastReceiver
    static ConnectivityChangedReceiver receiver = new ConnectivityChangedReceiver();

    @Override
    protected void onPause() {
        super.onPause();
        // Stop listening for connectivity change events
        unregisterReceiver(receiver);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Listen for connectivity change events
        registerReceiver(receiver, filter);
    }
}

您的所有活动都应该扩展BaseActivity,如果它们需要在onResume()onPause()中做任何特殊的事情,只需确保调用super.onXXXXX(),如下所示:

代码语言:javascript
复制
public MyActivity extends BaseActivity {
    @Override
    protected void onResume() {
        super.onResume();
        // Here you do whatever you need to do in onResume() of your activity
        ...
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Here you do whatever you need to do in onPause() of your activity
        ...
    }
}

我没有通过编译器运行代码,所以如果有拼写错误或者我遗漏了什么,我向您道歉。

票数 13
EN

Stack Overflow用户

发布于 2012-10-25 21:05:12

我认为你必须确保当应用程序在后台时,你没有使用接收器。为此,您必须使用每个活动的onPause()和onResume()方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12274997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档