为什么Intent.createChooser()需要一个BroadcastReceiver以及如何实现?

Jac*_*ble 13 android broadcastreceiver android-intent

从我的实现中调用的以下代码段onOptionsItemSelected()可以很好地将用户从我的应用程序带到邮件客户端,邮件地址,主题和正文已预先填好.我正在使用它作为一种让用户给我反馈的简单方法.

String uriText =
    "mailto:" + emailAddress +
    "?subject=" + subject +
    "&body=" + body;

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uriText));
startActivity(Intent.createChooser(emailIntent, "Pick an email app:"));
Run Code Online (Sandbox Code Playgroud)

当邮件应用程序打开时(在我的带有Android 4.0.4的Nexus S上),LogCat输出以下内容,我无法弄清楚原因; Google和SO搜索createChooser unregisterReceiver看起来毫无结果,我找不到很多这样的例子createChooser()也会unregisterReceiver()以一种帮助这种情况的方式调用.

04-08 21:26:19.094:E/ActivityThread(27894):活动com.android.internal.app.ChooserActivity泄露了最初在这里注册的IntentReceiver com.android.internal.app.ResolverActivity$1@4150aac8.你是否错过了对unregisterReceiver()的调用?

04-08 21:26:19.094:E/ActivityThread(27894):android.app.IntentReceiverLeaked:Activity com.android.internal.app.ChooserActivity泄露了最初的IntentReceiver com.android.internal.app.ResolverActivity$1@4150aac8在这里注册.你是否错过了对unregisterReceiver()的调用?

04-08 21:26:19.094:E/ActivityThread(27894):在android.app.LoadedApk $ ReceiverDispatcher.(LoadedApk.java:763)

这感觉就像一个Android bug,因为我自己的代码没有调用registerReceiver(),所以为什么Android抱怨我需要调用unregisterReceiver()

bla*_*oni 11

我在带有4.0.4的Galaxy Nexus上也看到了这一点,但前提是只有一个选项且选择器没有出现.

这是Android源代码中的一个错误 - 您无能为力.他们的ResolverActivity注册了BroadcastReceiver,但并不总是注销它.

更多详情:

Intent.createChooser()将启动ResolverActivity.在onCreate()中,活动调用

mPackageMonitor.register(this, false);
Run Code Online (Sandbox Code Playgroud)

mPackageMonitor是一个BroadcastReceiver,register()它在其中注册活动.通常,接收器未注册onStop().但是,稍后在onCreate()代码中检查用户可以选择的选项数量.如果它只有一个叫它finish().因为finish()onCreate()其他生命周期中调用的方法从未被调用过,所以它会直接跳到onDestroy()- 泄漏接收器.

我在Android问题数据库中没有看到这个错误,所以我创建了一个.

有关详细信息,您可以在代码中看到:

作为旁注,Google使用电子邮件作为您何时不想使用选择器的示例,因此您可以考虑正常启动意图.请参阅Intent#ACTION_CHOOSER的javadoc .