如何取消注册附加到LocalBroadcastManager的接收器?

4
如何注销与LocalBroadcastManager相关的接收器?
我尝试了以下代码:
unregisterReceiver(broadcastReceiver);

但是它给我抛出了一个异常

java.lang.IllegalArgumentException: 未注册的接收器:

这是我的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiverCancelPd, new IntentFilter(PelicanApplication.identifierCancelPd));
    LocalBroadcastManager.getInstance(this).registerReceiver(bReceiverSignOut, new IntentFilter(PelicanApplication.identifierSignOut));
    LocalBroadcastManager.getInstance(this).registerReceiver(bReceiverNearByDeliveries, new IntentFilter(PelicanApplication.identifierNBD));
}


@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(broadcastReceiverCancelPd);
    unregisterReceiver(bReceiverSignOut);
    unregisterReceiver(bReceiverNearByDeliveries);
}
5个回答

12

像您这样调用 unregisterReceiver() 方法是在当前上下文中调用该方法,而不是在本地广播管理器中调用。 您需要调用 LocalBroadcastManager.getInstance(this).unregisterReceiver(); 方法。


LocalBroadcastManager已被弃用,你知道使用LiveData或其他方式替代unregisterReceiver()的方法吗? - C.F.G
我想removeObserver()可能是类似的方法,但你可能不需要担心它。也可以看一下observe()的描述。 - Mike M.

1
在停止时做像这样的事情。
LocalBroadcastManager.getInstance(context).unregisterReceiver(this);

0
将您的unregisterReceiver()函数移至onDestroy()

0

对于一个Activity:

为了从你的应用程序中注册广播接收器,首先需要从你的AndroidManifest.xml文件中删除标签。接着,在onResume()中调用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法。在onPause()中使用unregisterReceiver(BroadcastReceiver receiver)方法取消注册广播接收器。

对于一个Service:

从清单文件中删除标签后,可以在onCreate()中使用相同的方法注册Broadcast receiver并且在onDestroy()中注销。


0

我认为你的应用程序在这一行崩溃了:

unregisterReceiver(batteryNotifyReceiver);

如果接收器未注册或已注销,则调用unregisterReceiver()会抛出IllegalArgumentException异常。因此,在调用注销之前,您必须检查接收器是否已注册。
if (batteryNotifyReceiver!= null) {
                    unregisterReceiver(batteryNotifyReceiver);
                    batteryNotifyReceiver= null;
            }

希望你的问题能够得到解决。我在我的应用程序中以这种方式解决了这个错误。试一试,然后回复我。


Mike M. 的解决方案解决了我的问题(它与 LocalBroadcastManager 相关)...但我也应该遵循您的建议。最好先检查接收器是否为 null,然后再注销它。 - Shehan Ekanayake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接