onActivityResult () вызывается преждевременно - PullRequest
91 голосов
/ 28 июля 2010

Я запускаю 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?Или как еще объяснить этот преждевременный вызов?

Ответы [ 5 ]

249 голосов
/ 23 августа 2010

Это исправлено изменением режима запуска на singleTop:

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

В Android есть ошибка / функция (?), Которая немедленно сообщает о результате (который еще не установлен) для Activity, объявленному как singleTask (несмотря на то, что действие продолжает выполняться). Если мы изменим launchMode родительской активности с singleTask на singleTop, все будет работать так, как ожидается - результат сообщается только после завершения действия. Хотя такое поведение имеет определенное объяснение (может существовать только одно действие singleTask, и для него может быть несколько официантов), для меня это все же не логическое ограничение.

16 голосов
/ 17 июня 2015

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

4 голосов
/ 11 октября 2011

Я просто удалил все свои собственные "android: launchMode" из моей деятельности, и все работало как шармЭто не очень хорошая идея, если вы не знаете ТОЧНО, что понимает Android ... Android немного сложнее в этом смысле.

1 голос
/ 27 июня 2015

Это случилось со мной, когда в намерении был установлен флаг Intent.FLAG_RECEIVER_FOREGROUND.

(Да, этот флаг не связан с деятельностью, но я имел его во всех своих намерениях как часть решения дробовика для другой проблемы .)

0 голосов
/ 29 июля 2010

Опять же, как в комментарии Майры, setResult() не имеет ничего общего с вашей проблемой. по какой-то причине класс MyConfigure завершает себя сам, а когда это происходит PreferenceActivity просто предполагает, что может быть результат от MyConfigure, потому что именно так вы написали код.

это также происходит, когда вы отменяете любое действие, начатое с startActivityForResult() ...

Итак, я думаю, что лучше сосредоточиться на том, почему ваш MyConfigure класс принудительно закончен.

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