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

2019-06-23 11:34发布

下面的代码片段,从我实施所谓的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:"));

当邮件应用程序中打开(在与Android 4.0.4我的Nexus S),logcat的输出以下内容,我想不通为什么; 谷歌和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:活动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的错误,因为我自己的代码不调用registerReceiver()所以为什么Android的抱怨,我需要调用unregisterReceiver()

Answer 1:

我看到这个问题,以及对我的Galaxy Nexus与4.0.4,但前提只有一个选项,并选择器不会出现。

这是Android的源中的错误 - 没有什么可以做的。 他们ResolverActivity注册一个BroadcastReceiver,但并不总是注销它。

更多详情:

Intent.createChooser()将启动一个ResolverActivity。 在的onCreate(),活动电话

mPackageMonitor.register(this, false);

mPackageMonitor是一个BroadcastReceiver和内register()它自己注册上的活动。 通常情况下,接收机在注销onStop() 然而,在后来onCreate()代码检查多少选项,用户可以从中选择。 如果只有一个调用finish() 由于finish()中被调用onCreate()的其他生命周期方法不会被调用,并直接跳转到onDestroy() -泄漏的接收器。

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

欲了解更多信息,你可以在代码中看到这一点:

  • ResolverActivity
  • PackageMonitor

作为一个侧面说明,谷歌使用电子邮件作为的时候,你不会想使用选择器,所以你可以考虑刚推出的意图通常是一个例子。 请参阅的javadoc 意向#ACTION_CHOOSER 。



Answer 2:

问题简单解决。

更多资讯: https://developer.android.com/training/basics/intents/sending.html

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 );
}


文章来源: Why does Intent.createChooser() need a BroadcastReceiver and how to implement?