0

我通过以下方式在我的活动中定义了一个 BroadcastReceiver,以从另一个线程上运行的 IntentService 获取结果:

receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {

            boolean isSyncCompleted = intent.getBooleanExtra("issynccompleted", false);
            if (isSyncCompleted){
                showAlert("Sync completed in service");
            }
            context.unregisterReceiver(receiver);
        }
    };
    //register receiver for service
    registerReceiver(receiver, new IntentFilter(ContentSyncService.SERVICE_INTENT_FILTER));

请注意,我在 onReceive 代码块中注销我的接收器,而不是在 onPause 中。那是因为即使活动已被破坏,我也想让接收者监听。

但我不断收到错误消息:“ Activity ... 已泄露 IntentReceiver ... 最初在此处注册。您是否错过了对 unregisterReceiver() 的调用?

4

3 回答 3

0

这个解决方案对我有用,我覆盖了 Activity 方法,而不是 BrodcastReceiver:

@Override
protected void onPause() {
    super.onPause();
    // unregister receiver
    LocalBroadcastManager.getInstance(this).unregisterReceiver(
            mMessageReceiver);
}

@Override
protected void onResume() {
    super.onResume();
    // register receiver
    LocalBroadcastManager.getInstance(this).registerReceiver(
            mMessageReceiver, new IntentFilter("your.package.name"));
}
于 2013-11-12T16:57:12.550 回答
0

在你的接收器中使用 context.unregisterReceiver(receiver) ,

试试看:activity.unregisterReceiver(this);

于 2013-11-21T18:38:22.310 回答
0

仅当您至少收到一次操作时才会取消注册接收器。因此,您需要在 OnPause 中取消注册您的接收器(如果需要,也可以在其他地方),因为您可以安全地始终取消注册接收器。

于 2013-11-12T19:12:59.307 回答