Android 为什么Intent.createChooser()需要广播接收器,以及如何实现?

Android 为什么Intent.createChooser()需要广播接收器,以及如何实现?,android,android-intent,broadcastreceiver,Android,Android Intent,Broadcastreceiver,下面的代码片段是从我的onOptionsItemSelected()实现中调用的,它可以很好地将用户从我的应用程序传送到邮件客户端,并预先填充电子邮件地址、主题和正文。我用它作为一种简单的方式,让用户给我反馈 String uriText = "mailto:" + emailAddress + "?subject=" + subject + "&body=" + body; Intent emailI

下面的代码片段是从我的
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:"));
当邮件应用程序打开时(在我的NexusS和Android 4.0.4上),LogCat输出以下内容,我不知道为什么;谷歌等搜索createChooser unregisterReceiver似乎毫无结果,我也找不到许多同样调用
unregisterReceiver()
createChooser()
的例子来帮助这种情况

04-08 21:26:19.094:E/ActivityThread(27894):Activity com.android.internal.app.choose活动已泄漏IntentReceiver com.android.internal.app.ResolveActivity$1@4150aac8原来是在这里注册的。是否缺少对unregisterReceiver()的调用

04-08 21:26:19.094:E/ActivityThread(27894):android.app.IntentReceiver泄漏:Activity com.android.internal.app.choose活动已泄漏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()

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

这是Android源代码中的一个bug——对此你无能为力。它们的分辨率注册了一个广播接收器,但并不总是注销它

更多详情:

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

mPackageMonitor.register(this, false);
mPackageMonitor是一个广播接收器,在
register()
中,它在活动中注册自身。通常,接收器在
onStop()
中注销。但是,稍后在
onCreate()
中,代码检查用户可以从中选择多少选项。如果只有一个,它将调用
finish()
。由于在
onCreate()
中调用了
finish()
,因此不会调用其他生命周期方法,它会直接跳到
onDestroy()
-泄漏接收器

我在安卓问题数据库中没有看到这方面的错误,所以我

有关更多信息,请参见以下代码:


作为一个旁注,谷歌使用电子邮件作为一个例子,当你不想使用选择器时,你可以考虑正常地启动意图。有关问题的简单解决方法,请参阅javadocs

更多信息请点击此处:

urilocation=Uri.parse(“地理位置:0,0?q=1600+圆形剧场+公园道+山景+加利福尼亚”);
Intent mapIntent=新的Intent(Intent.ACTION\u视图、位置);
PackageManager pkManager=getPackageManager();
列表活动=pkManager.queryIntentActivities(mapIntent,0);
如果(activities.size()>1){
//创建并启动选择器
Intent chooser=Intent.createChooser(mapIntent,“打开时使用”);
星触觉(选择器);
}否则{
星触觉(mapIntent);
}

我的nexus s 4.0.4也有同样的问题,这在模拟器中会发生吗?如果没有,可能是相关的。你有没有谷歌的链接参考说不要使用choose发送电子邮件?它在javadocs for Intent#ACTION#CHOOSER中。您可以使用上面的链接或在Eclipse.FYI中查看它们,无论有多少选项,Android 4.4上似乎都会出现这种情况。例如,将意图类型更改为“text/html”会有所帮助,但它也限制了实际可以共享到的应用程序的数量。你知道为什么安卓4.4会导致这种情况吗?似乎安卓4.4有一个严重的问题,因为这个问题发生在Youtube、Tumblr和其他各种应用程序上。以下是我的解决方案:
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

PackageManager pkManager = getPackageManager();
List<ResolveInfo> activities = pkManager.queryIntentActivities(mapIntent, 0);

if (activities.size() > 1) {
    // Create and start the chooser
    Intent chooser = Intent.createChooser(mapIntent, "Open with");
    startActivity(chooser);

  } else {
    startActivity( mapIntent );
}