如何在安卓系统中检查广播是否已注销?

3

在我的活动中,我尝试注销Broadcast Receiver。我只需添加以下代码即可进行注销。

unregisterReceiver(myBroadcastReceiver);

但问题是我的Broadcast在两种情况下会注销掉:
1) 如果我在onActvityResult中得到结果。
2) onDestroy
但问题是,当我的Broadcast ReceiveronActvityResult注销时,当用户尝试关闭Activity时,我的onDestroy被调用并且我的应用程序崩溃了。

我的Logcat:

Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.coincide.ridetog.post_ride.PostRideActvity$MyBroadcastReceiver@831c755 at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:782) at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1205) at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:586) at com.coincide.ridetog.post_ride.PostRideActvity.onDestroy(PostRideActvity.java:300)

这是我的onDestroy()

@Override
protected void onDestroy() {
    super.onDestroy();
    if (myBroadcastReceiver!=null) {
        unregisterReceiver(myBroadcastReceiver);
    }
}

你已经在检查myBroadcastReceiver是否为null了。是什么阻止了你使用显而易见(对程序员来说)的方法呢? - undefined
同时,这似乎是对BroadcastReceiver的一种误用...你试过如果打开了"不保留活动"选项,你的应用是否工作了吗? - undefined
1个回答

3
在您的活动中添加以下方法,并在onResume和onActivityResult回调中调用它。一旦调用该方法,它将将您的myBroadcastReceiver实例设置为null,因此它将避免多次执行,直到您创建新的myBroadcastReceiver实例。
private void unregisterMyBroadcastReceiver() {
    if (null != myBroadcastReceiver) {
        unregisterReceiver(myBroadcastReceiver);
        myBroadcastReceiver = null;
    }
}

这太明显了... :) - undefined
谢谢@AlexTa,这对我有用。我犯了一个错误,我以为当我取消注册广播时它会变成null。但你的答案是正确的做法。非常感谢像你这样的人让Stackoverflow变得非常有帮助。 - undefined

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