Android - startActivityForResult, немедленно запускающий onActivityResult - PullRequest
139 голосов
/ 27 октября 2011

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

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

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

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

Ответы [ 13 ]

305 голосов
/ 27 октября 2011

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

93 голосов
/ 01 февраля 2013

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

Из документов :

Этот флаг нельзя использовать, когдавызывающая сторона запрашивает результат от запускаемого действия.

21 голосов
/ 27 октября 2011

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

17 голосов
/ 19 июня 2014

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

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

5 голосов
/ 22 сентября 2017

Это также срабатывает, если в ваших намерениях есть FLAG_ACTIVITY_NEW_TASK.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
4 голосов
/ 21 сентября 2017

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

1 голос
/ 26 ноября 2018

Кроме того, проверьте, если android: noHistory = "true" для активности в манифесте, если да, он не будет работать.

1 голос
/ 07 декабря 2017

В 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

1 голос
/ 30 апреля 2016

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

android:noHistory="true"

Изменилось на «ложь» и теперь работает нормально.

0 голосов
/ 11 сентября 2018

Если вы определили android:noHistory="true" в действии в вашем AndroidManifest.xml, это вызовет ту же проблему здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...