我通过在特定活动中单击按钮来打开发送菜单:
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
(应该注意,我正在 Samsung Galaxy SII 上进行调试,并且这个线程 https://stackoverflow.com/questions/7526136/sprint-samsung-galaxy-s2-activity-has-leaked-intentreceiver-are-you-missing表明这可能是设备特定的错误?)
显然这是 Android 某些设备上的一个错误。请参阅此报告:http://code.google.com/p/android/issues/detail?id=29399 http://code.google.com/p/android/issues/detail?id=29399。看来只有当您使用选择器并且只有一个选项可供选择时才会出现问题。
如果您调用 Intent.createChooser(),如果只有可能的选项,它将泄漏 BroadcastReceiver。
根据当前的消息来源,问题似乎是 ResolverActivity 在 onCreate() 中注册接收器,但如果只有一个选项,则调用 finish() 。这会导致代码跳过 onStop(),这是接收器未注册的地方。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)