Android - startActivityForResult, немедленно запускающий onActivityResult


144

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

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

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

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

Ответы:


315

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


2
Спасибо вам обоим, у меня было это в моем файле манифеста, и я полностью забыл об этом
TomBomb,

9
ВОТ ЭТО ДА! Это кажется очевидной вещью, которую нужно добавить к Javadocs! Я потратил впустую целый вечер, пытаясь заставить это работать, и этот SO-ответ напомнил мне, что моя активность была установлена ​​на singleTop.
swooby

20
singleTopкажется хорошим для меня, singleTaskоднако вызывало эту проблему и, следовательно singleInstance, определенно сделало бы это
darnmason

4
Я также слишком долго отлаживал это! Спасибо!!
suomi35

4
В моем случае не определен какой-либо класс как singleInstance или singleTop, но все же это происходит ... какое-либо предложение?
Код

110

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

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

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


3
Это исправило проблему в моем случае. Проблема не была вызвана функцией SingleInstance, SingleTop или SingleTask.
Диана

Вы мята (спасатель жизни). Это была моя точная проблема, когда я хотел, чтобы пользователь захватил изображение во фрагменте
kyay

@ Диана, ты помнишь, что ты использовал вместо Intent.FLAG_ACTIVITY_NEW_TASK?
Кесельме

@Keselme К сожалению, это было давно, я хотел бы помочь, но я не помню, и я больше не могу получить доступ к этому коду.
Диана

Да, это исправлено. startActivityForResult не должен использоваться с Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen

21

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


18

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

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


Я знаю, что это старо, но это было настолько бесценным для меня, что я хотел сказать спасибо пользователю и указать всем, кто прыгает между действиями, что это чертовски золото! Спасла мою задницу во время хакатона;)
Уэс Винн

Это то, что требует большего внимания. Это лучшее решение и идеально подходит для меня. Вы сэкономили мне много времени, большое спасибо.
Аритра Рой

Повторно проголосуйте за этот ответ, так как это был именно тот вопрос, который у меня возник сегодня утром! Спасибо за решение!
Уилл Джонсон

Спасибо. intent.setFlags (0) решил проблему. Теперь второе приложение запускается нормально и возвращает результат вызывающему приложению.
Нияз

5

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


5

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

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

Спасибо. Я добавил FLAG_ACTIVITY_NEW_TASK в свою деятельность.
Чираг Савсани

1

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

android:noHistory="true"

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


1

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

  • все действия будут иметь одинаковый атрибут 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

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


0

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

  1. звонок getParent().startActivityForResult()из вашей под-деятельности

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

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

пример: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


Что вы думаете об этом особом случае при вызове веб-браузера по умолчанию: codeproject.com/Questions/990063/…
Ахмад Эбрахими,

0

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


0

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.