BroadcastReceiver问题(接收方未注册错误)

Squ*_*onk 4 android broadcastreceiver

可能重复:
Receiver未注册异常错误?

我有一个TabActivity,每个TabSpec的'内容'是我自己的GuideListActivity类.

有七个选项卡(一周中每天一个),每个GuideListActivity显示一个电视频道的电视指南信息/一周中的一天.

所述TabActivity维持该信道号码的用户正在观看指南的详细信息,并且当用户改变,以查看另一信道的信息,所述TabActivity使用sendStickyBroadcast()与意图识别哪个信道的信息,以显示(具有第一除去可能存在的任何先前的粘广播).

这可行,但我看起来像GuideListActivity的BroadcastReceiver看似随机的问题,这些问题太频繁而无法忽略(即使在'Beta'级代码中).我看到的错误是......

java.lang.RuntimeException: Unable to pause activity {com.mycompany.mypackage/com.mycompany.mypackage.GuideListActivity}: java.lang.IllegalArgumentException: Receiver not registered: com.mycompany.mypackage.GuideListActivity$ChannelChangeListener@462ebe20
Run Code Online (Sandbox Code Playgroud)

每个GuideListActivity都维护着自己的BroadcastReceiver(显然)示例......

public class GuideListActivity extends ListActivity {

    private ChannelChangeListener listener = null;
    private Intent ChannelChangeListenerIntent = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listener = new ChannelChangeListener();
    }

    @Override
    protected void onResume(){
        super.onResume();
        if (ChannelChangeListenerIntent == null)
            ChannelChangeListenerIntent = registerReceiver(listener, new IntentFilter(packageName + ".GUIDE_UPDATE"));
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (ChannelChangeListenerIntent != null)
            unregisterReceiver(listener); // <== EXCEPTION THROWN HERE
    }

    // Nested 'listener' class
    public class ChannelChangeListener extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // Handle intent
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,这似乎是随机的 - 我可以坚持一个频道并点击1,2或3甚至所有7个标签,然后点击下一个,抛出异常.其他时候它发生在第二次点击.

任何帮助解释这个以及如何解决它将非常感激.

小智 11

设置ChannelChangeListenerIntent为null onPause:

if (ChannelChangeListenerIntent != null) {
    unregisterReceiver(listener);
    ChannelChangeListenerIntent = null;
}
Run Code Online (Sandbox Code Playgroud)

暂停后可以恢复活动,因此活动可能不会在第二次调用中注册监听器onResume.