onActivityResult () викликаний передчасно


92

Я починаю Activity(нащадка PreferenceActivity) з моєї робочої діяльності наступним чином:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigureклас НЕ має setResult()дзвінків. Насправді MyConfigureклас не має коду, окрім випадків, OnCreate()коли він завантажує налаштування за допомогою addPreferencesFromResource.

Тепер onActivityResultвикликається requestCodeз 1458передчасно, відразу після того, MyConfigureдіяльність виконується. Тестувався на емуляторах 1.6 та 2.1, а також на пристрої 2.1. Чи є заклик setResult()поховати десь у PreferenceActivity? Або як ще можна пояснити цей передчасний дзвінок?


1
Діяльність не закінчується на setResults (), вона закінчується на finish (). Чи можете ви показати метод onCreate для вашої діяльності MyConfigure?
Шеріл Саймон

Правильно, це не так. Однак щось називає setResult () раніше часу, і мені цікаво, що це таке. Код onCreate є тривіальним: відкритий клас MyConfigure розширює PreferenceActivity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Євген Маєвський 'Зворотний дзвінок

як ви думаєте знати, що викликається setResult?
RoflcoptrException

Саме для цього я створив питання. Щоб з’ясувати, чому onActivityResult викликається передчасно.
Євген Маєвський 'Зворотний дзвінок

Що говорить висновок logcat протягом цього періоду? Зокрема, тег "ActivityManager", який показує, які наміри викликаються.
Крістофер Орр,

Відповіді:


254

Це виправлено зміною режиму запуску на singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

В Android є помилка / функція (?), Яка негайно повідомляє результат (який ще не встановлений) для Activity, оголошений як singleTask(незважаючи на те, що діяльність продовжує виконуватися). Якщо ми змінимо launchModeбатьківську активність з singleTaskна singleTop, все працює належним чином - результат повідомляється лише після завершення діяльності. Незважаючи на те, що така поведінка має певне пояснення ( singleTaskможе існувати лише одна діяльність, і для неї може статися кілька офіціантів), це все одно для мене не логічне обмеження.


2
Здається, помилка! ^^ дуже дивна поведінка!
Феліпе

7
Якщо діяльність має режим запуску singleTask, їй не потрібно отримувати результати від підзаходів, що використовують onActivityResult. Підзаходи просто викликають finish (), а потім починають основну діяльність із наміром передавати дані. В основній діяльності ви повинні замінити методNewIntent і обробити отриманий намір.
Nik

43
launchMode = "singleInstance" також спричиняє таку поведінку
ffleandro

1
Здається, це не спрацювало для мене, я спробував singleTop на батьківській діяльності, але безрезультатно. Я також встановив прапор наміру в FLAG_ACTIVITY_SINGLE_TOP, хоча запит тепер показує правильне значення, але результат завжди дорівнює 0.
Neon Warge

11
це відбувається на Kitkat 4.4.4, а не на Lolipop.
Сомасундарам Махеш

18

Я вирішив свою проблему після видалення intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);перед дзвінком fragment.startActivityForResult(intent, 0);.


1
Дякую! Це вирішило мою проблему. Чи є цьому десь пояснення?
Conner Harkness

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

4

Я щойно видалив весь свій власний "android: launchMode" зі своєї діяльності, і все працювало як шарм. Це не гарна ідея змінювати це, коли ви не знаєте ТОЧНО, що розуміє Android ... Android трохи хитрий таким чином.


1

Це трапилося зі мною, коли за наміром було встановлено Intent.FLAG_RECEIVER_FOREGROUNDпрапор.

(Так, цей прапор не пов’язаний з діяльністю, але я мав його на меті, як частину вирішення іншої проблеми .)


-1

Знову ж таки, як у коментарі Майри, setResult()це не має нічого спільного з вашою проблемою. з якихось причин MyConfigureклас самозавершується, і коли це відбувається, PreferenceActivityпросто припускає, що це може бути результатом, MyConfigureтому що саме так ви написали код.

це також трапляється, коли ви змушуєте назад будь-яку діяльність, яка розпочалася з startActivityForResult()...

Тож, думаю, краще зосередитись на тому, чому ваш MyConfigureклас примусово закінчений.


Клас MyConfigure НЕ закінчується, ваші припущення помиляються, вибачте. Якби це сталося, не було б питання
Євген Маєвський 'Зворотній дзвінок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.