Сохранение состояния приложения Android с использованием AlwaysRetainTaskState и lauchMode
-
20-09-2019 - |
Вопрос
В моем приложении для 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>
Итак, в конкретном случае использования, скажем, пользователь запускает приложение с главного экрана, щелкнув значок внутри средства запуска приложения.После запуска приложения пользователь переходит от основного действия к действию А и, наконец, к действию Б.На этом этапе пользователь решает проверить свой Facebook, поэтому он нажимает кнопку «Домой», чтобы перевести мое приложение в фоновый режим, и запускает приложение Facebook.
Проверив свой Facebook, пользователь хочет вернуться в мое приложение, поэтому он нажимает клавишу «Домой» и запускает приложение из панели запуска приложений (так же, как они это делали при первом запуске).
Когда пользователь возвращается в мое приложение, я хочу, чтобы приложение вернулось к последнему действию, в котором находился пользователь, когда приложение было переведено в фоновый режим, что в данном случае является действием B.В файле манифеста я установил AlwaysRetainTaskState=true, чтобы ОС не уничтожала активность моего приложения.
Теперь к моему вопросу:как мне получить поведение, которое я описал выше?Всякий раз, когда я щелкаю значок своего приложения, оно всегда начинается с основного действия, несмотря ни на что.Я думаю, это из-за атрибута Category.LAUNCHER.Я пробовал android:launchMode=singleTask, но это не изменило ситуацию;он всегда начинается с Main.
Если бы кто-нибудь мог уточнить фильтры намерений, режимы запуска и задачи, было бы здорово!
Решение
Я решил это, добавив безэкранный режим DispatcherActivity
и сделать его значением по умолчанию (используя тот же фильтр намерений).В своем onCreate
метод, который вы создаете и вызываете намерение на основе некоторого разумного значения по умолчанию (например, вашего основного действия) ИЛИ на основе некоторого сохраненного токена, который определяет, какое действие следует запустить.Этот токен сохраняется/обновляется в onStop
метод любого действия, которое вы хотите вызвать при перезапуске.Вы можете сохранить этот токен в настройках.
Логично здесь то, что последнее видимое действие будет выполнять метод onStop при прерывании.
Слово предостережения здесь:Я реализовал этот шаблон, и он работал достаточно хорошо.Однако, похоже, с историей это не слишком хорошо сочетается, и в конце концов я просто сдался и выдернул этот код.Никто пока не жаловался.
Другие советы
К вашему сведению singleTask
это не то, что вам нужно, поскольку оно запускает новую задачу:
http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
Как вы запускаете мероприятие Б?Какие-нибудь нестандартные режимы запуска или флаги намерений?
Для тех, кто приходит сюда с подобными проблемами, я обнаружил кое-что странное, что, возможно, и есть то, что вы видите...может быть.
Скажем, у меня есть приложение с действиями A -> B -> C и т. д.У меня были проблемы с моим приложением, которое всегда «возобновлялось» до A, если оно было запущено из списка приложений, т. е. средства запуска.Однако возобновление с экрана «возмущение» (длительное нажатие на главную) будет показывать правильное поведение возобновления (возобновление к B или C, как и ожидалось).В моем манифесте не было ничего особенного, в корневой активности у меня установлено значение AlwaysRetainTaskState="true", а режим запуска установлен по умолчанию (стандартный).
Я загружал APK на свой телефон через веб-сайт..После загрузки и установки Я бы нажал "Открыть" чтобы сразу запустить приложение.Почему-то (после удаления приложения) мне надоело снова скачивать, устанавливать, но потом я вместо этого нажал кнопку «Готово».Затем запуск приложения из списка запуска / «все приложения» имеет такое же поведение возобновления, как и возобновление из последних - другими словами, мои проблемы были вызваны каким-то образом из-за процесса установки при нажатии «Открыть» вместо «Готово».
Я проверил это «решение» на API10 (2.3.5) и API15 (4.0.4).