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
принудительно завершен.