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

时间:2017-11-23 11:58:29

标签: android broadcastreceiver android-application-class

我在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);
   }
}

5 个答案:

答案 0 :(得分:3)

一个建议是在您的启动器活动或所需活动中取消注册,如下所示:

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

unregisterReceiver课程中实施MyApplication方法:

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

答案 1 :(得分:1)

除了在Application类中使用Broadcast Receiver之外,您还可以为所有活动使用Base类。然后在基本活动中注册BR,然后向孩子提供回叫。 由于Activity具有严格的生命周期模型,因此最好在Activity而不是Application类中使用运行时广播接收器。

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

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

答案 2 :(得分:0)

我认为您应该使用LocalBroadcastManager来注册和取消注册接收方而不是BroadcastReceiver

Benefits to use 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();
}

答案 3 :(得分:0)

尝试使用以下代码:
  如果您已从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);
    }

如果以编程方式注册接收方:

@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();
}

答案 4 :(得分:-1)

您应该在onPause()中使用unregisterReceiver(BroadcastReceiver receiver)取消注册广播接收器。

示例:

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);
  }
}