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

时间:2011-02-10 13:07:50

标签: android broadcastreceiver

我有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.

7 个答案:

答案 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));

附加StackOverFlow / Tutorial

的参考

答案 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)

问题可能是您试图从接收器的上下文中取消注册接收器,而不是最初注册它的上下文。