Android - startActivityForResult негайно запускає onActivityResult


144

Я запускаю діяльність з основної діяльності в моєму додатку за допомогою дзвінка startActivityForResult(intent, ACTIVITY_TYPE), і всі вони працюють, окрім одного.

Цей, коли викликається, запускає активність за бажанням, але в журналі я бачу, що onActivityResult()він негайно запускається. Діяльність з’являється, але RESULT_CANCELEDнегайно повертається до onActivityResult().

Потім я взаємодію з діяльністю, натискаю кнопку, яка дзвонить finish(), і onActivityResult()цього разу не викликається (тому що, мабуть, результат уже повернуто).

Це має сенс для когось? Хтось бачив таку поведінку раніше?

Відповіді:


315

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


2
Дякую обом, я мав це у своєму файлі маніфестів і про нього зовсім забув
TomBomb

9
ОЦЕ ТАК! Це здається очевидною річчю, яку слід додати до javadocs! Я витрачав цілий вечір, намагаючись змусити це працювати, і ця відповідь ТА нагадувала мені, що для моєї активності було встановлено SingleTop.
swooby

20
singleTopмені здається прекрасним, singleTaskоднак викликав це питання, а значить, singleInstanceі безперечно зробив би це
darnmason

4
Я також витратив занадто довго налагодження цього! Дякую!!
suomi35

4
У моєму випадку не визначив жоден клас як singleInstance або singleTop, але все ж це відбувається ... будь-яка пропозиція?
CoDe

110

Крім того, переконайтеся, що у намірі не Intent.FLAG_ACTIVITY_NEW_TASKвстановлено.

З документів :

Цей прапор не можна використовувати, коли абонент вимагає результату від запущеної діяльності.


3
Це вирішило проблему в моєму випадку. Проблема не була викликана singleInstance, singleTop або singleTask.
Діана

Ти м’ята (рятувальник життя). Це була моя точна проблема, коли я хотів, щоб користувач
знімав

@Diana, ти пам’ятаєш, що ти використовував замість цього Intent.FLAG_ACTIVITY_NEW_TASK?
Кесельме

@Keselme Вибачте, минуло давно, я хотів би допомогти, але не пам’ятаю і більше не можу отримати доступ до цього коду.
Діана

Так, виправлено. startActivityForResult не слід використовувати з наміром.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) вирішив проблему. Тепер другий додаток запускається нормально і повертає результат до виклику програми
Niaz

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"

Змінив його на "false" і зараз працює чудово.


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" про активність у Manifest, якщо так, це не працюватиме.


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


Що ви думаєте про цей особливий випадок, коли телефонуєте за веб- браузером
Ахмад Ебрагімі

0

onActivityResult()також буде передаватися RESULT_CANCELEDяк resultCodeякщо ви неправильно написали ім'я пакета чи класу у файлі маніфесту.


0

В Android Manifest набір 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.