Сохранение состояния приложения для Android с использованием AlwaysRetainTaskState и lauchMode - PullRequest
14 голосов
/ 13 января 2010

В моем приложении для 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. В файле манифеста у меня естьset alwaysRetainTaskState = true, чтобы ОС не убивала активность моего приложения.

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

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

Ответы [ 3 ]

9 голосов
/ 13 января 2010

FYI singleTask - это не то, что вам нужно, поскольку запускается новая задача:

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

Как вы запускаете мероприятие B? Какие-нибудь нестандартные режимы запуска или флаги Intent?

7 голосов
/ 05 ноября 2012

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

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

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

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

3 голосов
/ 13 января 2010

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

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

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

...