Зачем 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 );
}