Android:即使我调用unregisterReceiver,也会抛出泄漏的IntentReceiver异常

Dou*_*ler 14 android exception

我不明白为什么我在按下后退按钮时会遇到此异常.我在onCreate方法中注册了IntentReceiver,它应该在onPause方法中取消注册.我在onPause方法内部的Log.w()调用让我相信正在调用unregisterReceiver()方法,但我仍然得到这个异常.

有什么想法吗?

private PlayerReceiver playerReceiver;

public void onCreate(Bundle savedInstanceState) {
 ...
     IntentFilter playerFilter;     
     playerReceiver = new PlayerReceiver();
     playerFilter = new IntentFilter(PlayerService.BUFFERING_FAILURE);
     playerFilter.addAction(PlayerService.BUFFERING_SUCCESS);
     registerReceiver(playerReceiver, playerFilter);
 ...
}

protected void onPause() {
 ...
     if (playerReceiver != null){
         unregisterReceiver(playerReceiver);
         Log.w(TAG, "playerReceiver has been unregistered");
         playerReceiver = null;
     }
 ...
}

public class PlayerReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(PlayerService.BUFFERING_FAILURE)){
            setListenButton(false);
        }
        closePlayDialog();
    }
}
Run Code Online (Sandbox Code Playgroud)

LogCat输出

08-26 11:44:28.646: WARN/WWOZMain(1058): playerReceiver has been unregistered    
08-26 11:44:29.476: ERROR/ActivityThread(1058): Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwoz.WWOZMain$PlayerReceiver@43e4dd60 that was originally registered here. Are you missing a call to unregisterReceiver()?    
08-26 11:44:29.476: ERROR/ActivityThread(1058): android.app.IntentReceiverLeaked: Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwoz.WWOZMain$PlayerReceiver@43e4dd60 that was original
Run Code Online (Sandbox Code Playgroud)

在这里注册.你是否错过了对unregisterReceiver()的调用?

pet*_*rim 20

这是Android活动生命周期问题.我在一个主要活动中看到它,然后使用返回到启动画面的后退按钮在设备上进行测试.

onPause()方法中.

取消注册BroadcastReceiver您在中创建的onCreate()

onRestart()重新注册一个全新的广播接收器.

在活动类中,您需要将广播接收器的记录保存为实例数据成员.

第二

我认为这也是Android的功能增强问题.

有时,开发人员需要广播接收器才能比活动更长久.例如,了解某些屏幕状态何时可用.考虑工作流模型的对话上下文,其具有许多状态.

第三

您可以使用活动注册和取消注册广播接收器,但是像isRegistered(BroadcastReceiver)Activity类中的简单调用可能非常有用.

如果需要接收活过的活动,那么我不回答,只是沉默的警告,加入unregister(X)onDestroy()呼叫.YMMV ;-)


Mul*_*ins 8

我有同样的问题.原因是我无意中两次注册了相同的BroadcastReceiver.