Зачем 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): в активности 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, потому что мой собственный код не вызывает registerReceiver(), так почему Android жалуется, что мне нужно позвонить unregisterReceiver()?

2 ответа

Решение

Я вижу это также на моем 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.

Простое решение проблемы.

Более подробная информация здесь: 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 );
}
Другие вопросы по тегам