小部件。 Activity 泄露了 IntentReceiver

Posted

技术标签:

【中文标题】小部件。 Activity 泄露了 IntentReceiver【英文标题】:Widget. Activity has leaked IntentReceiver 【发布时间】:2012-10-18 14:55:09 【问题描述】:

在我的Widget 我使用:

Intent intent = new Intent(context, ClassForWidget.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget1);            
views.setOnClickPendingIntent(R.id.layout_widget1, pendingIntent);`

而我的班级ClassForWidget 已经有一个BroadcastReceiver

BroadcastReceiver myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MyService.MY_ACTION);
registerReceiver(myReceiver, intentFilter);

所以,当我点击Widget 时,出现错误:

Activity .ClassForWidget 泄露了 IntentReceiver .ClassForWidget$MyReceiver@40ebe710 最初注册的 这里。您是否错过了对 unregisterReceiver() 的调用?

我该如何解决?谢谢。

【问题讨论】:

在注销您的接收器之前,您的活动已被终止 【参考方案1】:

通常你应该在 onResume 中注册并在 onPause(或 onStart 和 onStop)中取消注册。

protected void onPause() 
     if (myReceiver != null)
         unregisterReceiver(myReceiver);
         myReceiver = null;
     


希望对你有所帮助。

【讨论】:

【参考方案2】:

我相信,您需要调用unregisterReceiver() 方法才能取消注册广播接收器。我不确定你是如何为小部件执行此操作的,但如果它是 Activity,那么我们通常需要在 onStop() 中调用它。

【讨论】:

【参考方案3】:

您需要注销广播接收器。

在您的 OnDestroy() 方法中添加这一行:unregisterReceiver(myReceiver);

【讨论】:

以上是关于小部件。 Activity 泄露了 IntentReceiver的主要内容,如果未能解决你的问题,请参考以下文章

在 Activity 中访问小部件时出现 NullPointerException

从另一个 Activity 访问一个 Activity 中的小部件

无法在 Activity 中获取小部件 ID

从 Activity 更新 Android 小部件

从 Activity 手动更改小部件状态

当 Android 中的 Activity 内容更改时,小部件不更新