OnActivityResult(), вызванный преждевременно

Я запускаю 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 of 1458 преждевременно, сразу после выполнения операции MyConfigure. Протестировано на эмуляторах 1.6 и 2.1, а также на устройстве 2.1. Есть ли вызов setResult() похоронен где-то в PreferenceActivity? Или как еще можно объяснить этот преждевременный вызов?

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

это также происходит, когда вы принудительно возвращаете любую активность, начатую с startActivityForResult()...

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