小部件。 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