我有BroadcastReceiver
一次使用。
我正在活动中注册它。我无法将unregisterReceiver()
放在onPause
中,因为即使活动暂停或销毁,它也必须保持运行状态。
我希望BroadcastReceiver在完成后取消注册,如下所示:
public class SmsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
// do some code..
context.unregisterReceiver(this)
}
}
但它会导致异常:Receiver not registered.
答案 0 :(得分:25)
BroadcastReceiver
仅在执行onReceive()
方法时存在。因此,每次广播被发送/接收时,此评估为一个抛弃实例。见Broadcast Receiver Lifecycle。要动态注册/取消注册BroadcastReceiver
,您必须记住onPause()
中接收者的实例,以便在onResume()
期间再次注册。
答案 1 :(得分:10)
我知道这个问题已经有了答案但是试试这个代码
此代码适用于 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));
的参考
答案 2 :(得分:3)
只需向您在其中注册的活动添加方法调用,然后在 方法中取消注册接收方。这样你知道它的工作已经完成。
但是,如果活动暂停或销毁,接收器将无法工作。您必须在清单中声明它,或者在长期运行的服务中注册它,以使其在活动的生命周期内工作。据我所知,你不能取消注册清单中声明的接收器,因为你没有得到它注册的实例。但是调用服务取消注册它的方法应该可行。
如果您只需要一名工作人员一次性使用,请在清单中使用您正在广播的操作声明导出的IntentService。当收到意图并给出启动它的意图时,IntentService将被启动,然后当它完成它的工作时,它将自行停止。
答案 3 :(得分:2)
我遇到了同样的问题,实际上,正确答案是LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
但不是context.unregisterReceiver(this)
答案 4 :(得分:0)
您是否尝试过从服务/活动中取消注册接收器?如果你从接收器调用它来取消注册,可能会有一些问题。
答案 5 :(得分:0)
可能你已经在程序的其他地方取消注册,但这听起来不太可能。也许在context.unregisterReceiver
之前的某个地方,但是在onReceive
方法中,您调用了一个操作,这会导致在到达context.unregisterReceiver
之前取消重新接收接收器。
请确保您从尽可能少的地方取消注册接收器,最好是一个。
答案 6 :(得分:0)
问题可能是您试图从接收器的上下文中取消注册接收器,而不是最初注册它的上下文。