【问题标题】:Leaked IntentReceiver from sharing menu共享菜单中的 IntentReceiver 泄露
【发布时间】:2012-02-16 19:52:17
【问题描述】:

我正在通过单击特定活动中的按钮打开发送菜单:

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT, "meh");
try {
    startActivity(Intent.createChooser(i, "pfft"));
} ...

工作正常,但是当点击“返回”关闭它时,logcat 说

Activity com.android.internal.app.ChooserActivity has leaked IntentReceiver com.android.internal.app.ResolverActivity$1@405ab288 that was originally registered here. Are you missing a call to unregisterReceiver()?

没有其他事情发生 - 应用继续运行而没有问题。

搜索表明上面的代码显然已经注册了一个 BroadcaseReceiver,并且需要取消注册(通过 unregisterReceiver),可能在 onResume(或 onPause)期间。取消注册接收器的签名表明单个参数应该是 BroadcastReceiver 实例(有意义)。

我的问题是 - BroadcastReceiver 的引用在哪里? AFAICT 用于打开菜单的方法不返回 BroadcastReceiver - 我如何找到并引用适当的方法来取消注册?

TYIA

(应该注意我在三星 Galaxy SII 上调试,this thread 表示它可能是特定于设备的错误?)

【问题讨论】:

  • 我的 nexus 4.0.4 也有同样的问题
  • @PedroRainho 我从来没有解决这个问题 - 如果你找到答案,请回帖。谢谢。

标签: android


【解决方案1】:

显然,这是某些设备的 Android 中的错误。请参阅此报告:http://code.google.com/p/android/issues/detail?id=29399。看起来只有使用选择器时才有问题,并且只有一个选项可供选择。

如果你调用 Intent.createChooser(),如果只有可能的选项,它会泄漏一个 BroadcastReceiver。

根据当前来源,问题似乎是 ResolverActivity 正在 onCreate() 中注册接收器,但如果只有一个选项,则调用 finish()。这会导致代码跳过 onStop(),这是接收者未注册的地方。

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 2012-07-03
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2018-10-29
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多