简体   繁体   English

如何从应用程序类中注销广播接收器?

[英]How to unregister broadcast receiver from an Application Class?

I register broadcast receiver in Android's Application Class,but now my question is where to unregister that broadcast ?我在 Android 的应用程序类中注册了广播接收器,但现在我的问题是在哪里取消注册该广播?

public class MyApplication extends Application 

{

@Override
public void onCreate() {
     ..... 
     // OTHER INITIALIZATIONS
     initNetworkBR();
} 
private void initNetworkBR() {

      br = new BroadcastReceiver() {
        ....
      };
      IntentFilter filter = new IntentFilter();
      filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
      registerReceiver(br, filter);
   }
}

One suggestion is in your launcher activity or desired activity unregister that like this:一个建议是在您的启动器活动或所需的活动中取消注册,如下所示:

@Override
protected void onDestroy() {
    super.onDestroy();
    ((MyApplication) getApplication()).unregisterReceiver();
}

And implement unregisterReceiver method in MyApplication class:并在MyApplication类中实现unregisterReceiver方法:

public void unregisterReceiver() {
     unregisterReceiver(br);//your broadcast
}

Except using Broadcast Receiver in Application class you can Use a Base class for all your Activities.除了在应用程序类中使用广播接收器外,您可以为所有活动使用基类。 And register BR in the Base Activity then provide call backs to the childs.并在 Base Activity 中注册 BR,然后向孩子提供回调。 As Activity has a strict lifecycle model so its better to use Runtime Broadcast receivers in Activity rather than Application class .由于 Activity 具有严格的生命周期模型,因此最好在 Activity 中使用 Runtime Broadcast 接收器而不是 Application 类。

 public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onResume() {
        super.onResume();
        //registerReceiver Here
    }

    @Override
    protected void onPause() {
        super.onPause();
        //unregisterReceiver here
    }
}

I use Application.ActivityLifecycleCallbacks, that listen all callbacks from activities lifecycle.我使用 Application.ActivityLifecycleCallbacks,它监听来自活动生命周期的所有回调。 It can replace the suggestion to use a Base Activity using inheritance and in other hand use composition to resolve this problem.它可以代替建议使用继承的基本活动,另一方面使用组合来解决这个问题。

You implement Application.ActivityLifecycleCallbacks interface in a class and in on create from your application class register the callback as continue:您在一个类中实现Application.ActivityLifecycleCallbacks接口,并在从您的应用程序类创建时将回调注册为继续:

registerActivityLifecycleCallbacks(<here your typed class with ActivityLifecycleCallbacks>)

Then, you have full control over al activities lifecycle to do something like unregister or register receivers.然后,您可以完全控制所有活动生命周期来执行取消注册或注册接收者等操作。

I hope it can be helpful我希望它会有所帮助

As @Naruto Uzumaki mentioned above you can deregister it on the onDestroy method of Application.正如上面提到的@Naruto Uzumaki,您可以在 Application 的onDestroy方法上取消注册它。 But it's always a better option to use Broadcast Receiversin Activity instead of whole Application.但是使用广播接收器活动而不是整个应用程序总是更好的选择。

You can use the below approach to use it in Activity:-您可以使用以下方法在 Activity 中使用它:-

public class DetailsActivity {

private BroadcastReceiver mNetworkReceiver;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
    mNetworkReceiver = new NetworkReceiver();
    registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
 }

Here is the way to unregister it.这是注销它的方法。

 @Override
 protected void onDestroy() {
    super.onDestroy();
    unregisterNetworkChanges();
 }

 protected void unregisterNetworkChanges() {
    try {
        unregisterReceiver(mNetworkReceiver);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }
  }

You should use unregisterReceiver(BroadcastReceiver receiver) in your onPause() to unregister the Broadcast receiver.您应该在 onPause() 中使用 unregisterReceiver(BroadcastReceiver receiver) 来取消注册广播接收器。

Example:例子:

public class MyActivity extends Activity {
  private final BroadcastReceiver mybroadcast = new SmsBR();

  public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(mybroadcast, filter);
  }

  public void onPause() {
    super.onPause();

    unregisterReceiver(mybroadcast);
  }
}

I think you should use LocalBroadcastManager to register and unregister receiver instead of BroadcastReceiver .我认为您应该使用LocalBroadcastManager而不是BroadcastReceiver来注册和注销接收器。

Benefits to use LocalBroadcastManager 使用 LocalBroadcastManager 的好处

@Override
public void onCreate(Bundle savedInstanceState) {

  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

Try with below code :尝试使用以下代码:
if you have registered from Manifiest.xml如果您已从 Manifiest.xml 注册

ComponentName component = new ComponentName(context, MyReceiver.class);

    int status = context.getPackageManager().getComponentEnabledSetting(component);
    if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
     context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP);
    }

If programmatically registering reciever :如果以编程方式注册接收者:

@Override
public void onCreate(Bundle savedInstanceState) {

  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM