在onReceive中取消注册Android广播接收器会引发“Receiver not registered”

我有一个BroadcastReceiver一次性使用。

我正在注册一个活动。 我不能把unregisterReceiver()放在onPause因为即使活动被暂停或销毁,它也必须保持运行。

我想让BroadcastReceiver在完成时取消注册,如下所示:

 public class SmsReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { // do some code.. context.unregisterReceiver(this) } } 

但它会导致exception: Receiver not registered.

Related of "在onReceive中取消注册Android广播接收器会引发“Receiver not registered”"

BroadcastReceiver只在执行onReceive()方法的时候才存在。 因此,每次广播被触发/接收时, 这都会评估为抛弃实例。 请参阅广播接收器生命周期 。 要dynamic注册/注销BroadcastReceiver ,必须在onPause()记住接收者的实例,以在onResume()期间再次注册它。

我知道这个问题已经有了答案,但试试这个代码

此代码适用于BatteryInfo 。 它确实工作。

 private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent intent) { // TODO Auto-generated method stub int level = intent.getIntExtra("level", 0); Log.i("Battery", String.valueOf(level) + "%"); arg0.unregisterReceiver(mBatInfoReceiver); } }; //Below code is the Code which attaches the reciever put this code in which ever place you want. this.registerReceiver(this.mBatInfoReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED)); 

附加StackOverFlow / 教程的参考

只需将方法调用添加到您注册的活动中,然后在方法中取消注册接收方。 这样你就知道自己的工作已经完成了。

但是,如果活动暂停或销毁,则接收器将无法工作。 您必须在清单中声明它,或者将其注册到长时间运行的服务中,以使其在活动生命周期外运行。 据我所知,你不能注销清单中声明的​​接收者,因为你没有得到它注册的实例。 但方法调用服务注销它应该工作。

如果您只需要一次性使用工作人员,请使用您要广播的操作在清单中声明导出的IntentService。 IntentService将在接收到意图并启动它的意图时启动,然后当它完成它的工作时,它将自行停止。

我遇到了同样的问题,实际上,正确的答案是LocalBroadcastManager.getInstance(context).unregisterReceiver(this); 但不是context.unregisterReceiver(this)

您是否尝试从服务/活动注销reciver? 如果你从接收者那里取消自己的注册,也许会有一些问题。

可能你已经在程序的其他地方取消了注册,但是听起来不太可能。 也许在context.unregisterReceiver之前的某个地方,但是在onReceive方法中,您调用了一个操作,导致接收者在到达context.unregisterReceiver之前取消接收。

只要确保你从尽可能less的地方注销接收器,最好 – 只有一个。

也许问题在于你试图从接收者的上下文中取消注册接收者,而不是最初注册的上下文。