Android - startActivityForResult сразу же запускает onActivityResult - программирование

Android - startActivityForResult сразу же запускает onActivityResult

Я запускаю действия из основного действия в своем приложении, используя вызов startActivityForResult(intent, ACTIVITY_TYPE), и все они работают, но один.

Этот при вызове запускает действие по желанию, но в журнале я вижу, что onActivityResult() запускается немедленно. Активность отображается, но RESULT_CANCELED сразу возвращается в onActivityResult().

Затем я взаимодействую с активностью, нажимаю кнопку, которая вызывает finish(), а onActivityResult() не вызывается в этот раз (потому что, видимо, результат уже возвращен).

Это имеет смысл для всех? Кто-нибудь видел это поведение раньше?

4b9b3361

Ответ 1

Вы не можете использовать startActivityForResult(), если ваша активность запускается как singleInstance или singleTask. standard или singleTop режим запуска устранит проблему.

Ответ 2

Кроме того, убедитесь, что у намерения не установлено значение Intent.FLAG_ACTIVITY_NEW_TASK.

Ответ 3

Ранее я видел это поведение, убедитесь, что ваша активность деструкции (эта специальная деятельность) не является singleInstance в файле AndroidManifest. Если Activity singleInstance, то он будет возвращен RESULT_CANCELED перед запуском!

Ответ 4

Я также хотел бы добавить, что вы можете вызвать внешнее приложение с помощью:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Что создало бы намерение с Intent.FLAG_ACTIVITY_NEW_TASK, добавленным по умолчанию, так что вызов:
in.setFlags(0);
Который очистит этот флаг, а затем вы можете перейти к: startActivityForResult(in, action);

Причина, по которой я делаю это, заключается в том, что у меня есть приложение-утилита с общей функциональностью между несколькими другими приложениями, и я могу сохранить изменения кода в одном месте, а не беспокоиться о нескольких обновлениях.

Ответ 5

Моя проблема заключалась в вызове. Его объявление в AndroidManifest имело следующее свойство:

android:noHistory="true"

Изменено на "false" и теперь отлично работает.

Ответ 6

startActivityForResult() не работает с активностью singleInstance или singleTask в пред-леллиповой версии Android. Начиная с Android 5 он работает (см. этот ответ для получения более подробной информации).

Ответ 7

Он также запускается, если у вас есть FLAG_ACTIVITY_NEW_TASK в ваших намерениях.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

Ответ 8

Для ActivityGroup или TabHost и других, возможно, xxxActivity является subActivity своего родителя. Тогда startActivityForResult не может работать, но родитель может получить результат.

  • вызывать getParent().startActivityForResult() из вашего под-действия

  • ваш родитель (ActivityGroup) сможет обрабатывать onActivityResult. Поэтому я создал подкласс ActivityGroup и обработал этот onActivityResult.

  • Вы можете перенаправить этот результат обратно в под-активность, если вам нужно. Просто введите текущую активность getLocalActivityManager().getCurrentActivity(). Мои под-действия наследуются от пользовательской активности, поэтому я добавил handleActivityResult(requestCode, resultCode, data) в этот подкласс для ActivityGroup для вызова.

example: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html

Ответ 9

onActivityResult() также передаст RESULT_CANCELED как resultCode, если вы пропустили пакет или имя класса в файле манифеста.

Ответ 10

В Android Manifest установить android:launchMode="singleTop" для активности, которую вы хотите открыть с результатом и при открытии флага установки активности intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Ответ 11

Android 4.4 имеет небольшую проблему с ожиданием возврата в конце закрытия actvity Чтобы решить эту проблему, важно установить:

  • все действия будут иметь атрибут Affinity тот же. (TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Это решение работает со всей версией Android

Смотрите это для taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072