Сохранение состояния приложения Android с использованием alwaysRetainTaskState и lauchMode

В моем приложении для Android у меня есть основное действие, которое служит точкой входа в мое приложение, которое настроено в моем файле манифеста следующим образом:

<activity android:name=".Main" android:label="@string/app_name" android:screenOrientation="portrait" android:alwaysRetainTaskState="true" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

Поэтому для конкретного примера использования пользователь может запустить приложение с главного экрана, щелкнув значок в панели запуска приложения. После запуска приложения пользователь переходит от основной операции к активности A, а затем, наконец, к активности B. На этом этапе пользователь решает проверить свою фейсбук, поэтому они нажимают кнопку «домой», чтобы поместить мое приложение в фоновом режиме, и запускает Приложение facebook.

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

Когда пользователь возвращается в мое приложение, я хочу, чтобы приложение вернулось к последнему действию, на котором был пользователь, когда приложение было помещено в фоновое изображение, которое в этом случае является активностью B. В файле манифеста я установил alwaysRetainTaskState = true Чтобы ОС не убивала действия моего приложения.

Теперь на мой вопрос: как мне получить описанное выше поведение? Всякий раз, когда я нажимаю значок своего приложения, он всегда начинается с Основной деятельности, несмотря ни на что. Я думаю, это из-за атрибута category.LAUNCHER. Я пробовал Android: launchMode = singleTask, но это не изменило; Он всегда начинается с Main.

Если кто-то может прояснить фильтры намерений, режимы запуска и задачи, это было бы здорово!

Solutions Collecting From Web of "Сохранение состояния приложения Android с использованием alwaysRetainTaskState и lauchMode"

Я решил это, добавив экранную DispatcherActivity и сделав его по умолчанию (используя тот же фильтр намерений). В методе onCreate вы создаете и вызываете Intent на основе некоторого разумного значения по умолчанию (например, основной активности) ИЛИ на основе некоторого сохраненного токена, который идентифицирует, какую активность следует запустить. Этот токен сохраняется / обновляется в методе onStop любой активности, которую вы хотите вызвать при перезагрузке. Вы можете сохранить этот токен в настройках.

Рациональным здесь является то, что последняя активность, которая была видима, будет прервана при использовании метода onStop.

Слово предостережения здесь: я реализовал этот шаблон, и он работал достаточно хорошо. Однако, похоже, он не слишком хорошо играет в истории, и, наконец, я просто сдался и выдернул этот код. Пока никто не жаловался.

FYI singleTask не то, что вы хотите, так как он запускает новую задачу:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

Как вы запускаете Activity B? Любые нестандартные режимы запуска или флаги Intent?

Для тех, кто придет сюда с подобными проблемами, я нашел что-то странное, возможно, это то, что вы видите … может быть.

Скажем, у меня есть приложение с действиями A -> B -> C и т. Д. У меня возникли проблемы с моим приложением, всегда «возобновляющимся» до A, если оно было запущено из списка приложений aka launcher. Возобновление с экрана «resents» (длинное домашнее нажатие) будет демонстрировать правильное поведение при воспроизведении (возобновление до B или C, как ожидалось). Мой манифест не был ничем особенным, у меня всегда установленRetainTaskState = "true" в моем корневом действии, а режим запуска по умолчанию (стандартный).

Я загружал apk на свой телефон через веб-сайт . После загрузки и установки я бы нажал «Открыть», чтобы сразу запустить приложение. По какой-то причине (после удаления приложения) я устал загружать снова, устанавливая, но затем я нажал кнопку «Готово» . Затем запуск приложения из списка запуска / «всех приложений» имеет такое же поведение, что и при возобновлении работы с повторами – другими словами, мои проблемы вызывались каким-то образом из-за процесса установки при нажатии «Открыть» вместо «Готово».

Я проверил это «решение» на API10 (2.3.5) и API15 (4.0.4)