Это классическая «игра» разработки Android. Здесь есть два вопроса:
Просматривая все эти потоки, я подозреваю, что большую часть времени разработчики говорят об этих двух разных проблемах одновременно ... следовательно, вся путаница и сообщения «это не работает для меня».
Во-первых, для уточнения «предполагаемого» поведения: onSaveInstance и onRestoreInstance являются хрупкими и только для переходного состояния. Предполагаемое использование (afaict) - это обработка активности при повороте телефона (изменение ориентации). Другими словами, предполагаемое использование - это когда ваша активность по-прежнему логически «сверху», но все же должна быть восстановлена системой. Сохраненный пакет не сохраняется за пределами процесса / памяти / gc, поэтому вы не можете положиться на это, если ваша деятельность переходит на задний план. Да, возможно, память вашей активности выдержит свою поездку на задний план и выйдет из GC, но это ненадежно (и это не предсказуемо).
Итак, если у вас есть сценарий, где есть смысл «пользовательский прогресс», или состояние, которое должно сохраняться между «запусками» вашего приложения, руководство должно использовать onPause и onResume. Вы должны сами выбрать и подготовить постоянный магазин.
НО - есть очень запутанная ошибка, которая усложняет все это. Подробности здесь:
http://code.google.com/p/android/issues/detail?id=2373
http : //code.google.com/p/android/issues/detail? id = 5277
В принципе, если ваше приложение запущено с флагом SingleTask, а затем вы запускаете его из главного экрана или меню запуска, то последующий вызов создаст новую задачу ... у вас будет фактически два разных экземпляра вашего приложения, населяющих один и тот же стек ..., который становится очень странным очень быстро. Это происходит, когда вы запускаете свое приложение во время разработки (т. Е. Из Eclipse или Intellij), поэтому разработчики часто сталкиваются с этим.
Я сражался через эти потоки в течение нескольких часов, прежде чем понял, что моей основной проблемой была эта ошибка, а не предполагаемое поведение каркаса , Отличный способ записи и обхода (UPDATE: см. Ниже), по-видимому, принадлежит пользователю @kaciula в этом ответе:
UPDATE Июнь 2013 г. : Через несколько месяцев я наконец нашел правильное решение. Вам не нужно самостоятельно управлять любыми флагами с установленными состояниями, а вы можете обнаружить это из фреймворка и поручиться соответствующим образом. Я использую это в начале моего LauncherActivity.onCreate:
if (!isTaskRoot()) {
Intent intent = getIntent();
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && action != null && action.equals(Intent.ACTION_MAIN)) {
finish();
return;
}
}