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

StackOverflow https://stackoverflow.com/questions/2059344

Вопрос

В моем приложении для 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top