Подтвердить что ты не робот

Почему Intent.createChooser() нуждается в BroadcastReceiver и как реализовать?

Следующий фрагмент, вызванный из моей реализации 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:"));

Когда открывается почтовое приложение (на моем Nexus S с Android 4.0.4), LogCat выводит следующее, и я не могу понять, почему; Поиски Google и SO для createChooser unregisterReceiver кажутся бесплодными, и я не могу найти много примеров createChooser(), которые также называют unregisterReceiver() таким образом, чтобы это помогло.

04-08 21: 26: 19.094: E/ActivityThread (27894): Activity com.android.internal.app.ChooserActivity просочился IntentReceiver [email protected], который был первоначально зарегистрирован здесь. Вам не хватает вызова unregisterReceiver()?

04-08 21: 26: 19.094: E/ActivityThread (27894): android.app.IntentReceiverLeaked: Activity com.android.internal.app.ChooserActivity просочилась IntentReceiver [email protected] который был первоначально зарегистрирован здесь. Вам не хватает вызова unregisterReceiver()?

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

Это похоже на ошибку Android, потому что мой собственный код не вызывает registerReceiver(), поэтому почему Android жалуется, что мне нужно позвонить unregisterReceiver()?

4b9b3361

Ответ 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 я не обнаружил ошибку, поэтому я создал один.

Для получения дополнительной информации вы можете увидеть это в коде:

В качестве дополнительной заметки Google использует электронную почту в качестве примера того, когда вы не захотите использовать выборщик, чтобы вы могли просто начать его намерение. См. Javadocs для Intent # ACTION_CHOOSER.

Ответ 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 );
}