2012-02-16 69 views
2

我从一个按钮,点击特定活动打开发送菜单泄露IntentReceiver:从共享菜单

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 [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?

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

搜索说,显然上面的代码已经注册了一个BroadcaseReceiver,并且它需要在onResume(或onPause)过程中注销(通过unregisterReceiver)。注销接收者的签名表示单个参数应该是BroadcastReceiver实例(有意义)。

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

TYIA

(要注意的是,我调试运行在三星Galaxy SII,并this thread表明它可能是一个与设备相关的bug?)

+0

我与我的nexus s有同样的问题4.0.4 – 2012-04-09 21:40:38

+0

@PedroRainho我从来没有得到这个解决 - 如果你找到答案,请回发。谢谢。 – momo 2012-04-10 15:08:18

回答

0

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

如果您调用Intent.createChooser(),如果只有可能的选项,它将泄漏BroadcastReceiver。

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