В Android API 19 (4.4) метод намерения.createChooser вызывает IntentServiceLeak

Запуская мое приложение на новом устройстве Android KitKat (API 19, 4.4), я получаю сообщение «Скопировано в буфер обмена» каждый раз, когда пытаюсь создать средство выбора намерений. Это происходит на Youtube, Tumblr и в других приложениях на Android KitKat. Глядя на журналы, я вижу следующее исключение:

com.android.internal.app.ChooserActivity слил IntentReceiver com.android.internal.app.ResolverActivity$1@4150aac8

Раньше это было проблемой, когда на устройстве не было нескольких приложений для Intent (см. BroadcastReceiver-and-how-to-implement">Почему Intent.createChooser() нужен BroadcastReceiver и как его реализовать?). Однако на моем устройстве это не так. Похоже, что-то не так в Android API 19.


person LyteSpeed    schedule 07.11.2013    source источник
comment
Обсуждение этой ошибки: android.stackexchange.com/questions/42057/ и reddit.com/r/Android/comments/1rcnow/. Кроме того, здесь есть отчет об ошибке, который вы можете отметить звездочкой: code.google. com/p/android/issues/detail?id=61937   -  person halr9000    schedule 04.12.2013


Ответы (2)


Вот мое обходное решение для этой проблемы. Сначала я определяю, работает ли устройство на KIT_KAT или выше, и вместо создания средства выбора я просто пытаюсь запустить намерение. Это заставит Android спросить пользователя, с каким приложением он хочет выполнить действие (если только у пользователя уже нет значения по умолчанию для всех намерений ACTION_SEND.

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setType("text/plain");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // This will open the "Complete action with" dialog if the user doesn't have a default app set.
    context.startActivity(sendIntent);
} else {
    context.startActivity(Intent.createChooser(sendIntent, "Share Via"));
}
person LyteSpeed    schedule 07.11.2013

@clu Имеет правильный ответ, только наоборот, лол. Это должно быть так:

//Create the intent to share and set extras
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setType("text/plain");

//Check if device API is LESS than KitKat
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT)
    context.startActivity(sendIntent);
else
    context.startActivity(Intent.createChooser(sendIntent, "Share"));

Эту проверку сборки также можно сократить до однострочника:

//Create the intent to share and set extras
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setType("text/plain");

//Check if device API is LESS than KitKat
startActivity(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ? sendIntent : intent.createChooser(sendIntent, "Share"));
person Tyler    schedule 19.08.2015