Как заставить приложение Android вернуться к последнему открытому действию при перезапуске?

Можно ли настроить приложение для Android таким образом, чтобы, если пользователь открыл ваше приложение, запустил множество действий, затем вернулся на домашний экран и снова перезапустил ваше приложение, вместо того, чтобы перейти к основному действию, они вместо этого будут переведены в наивысшую активность в стеке (самая последняя активность в вашем приложении)?

3 ответа

Решение

При запуске с помощью значка на главном экране Android всегда запускает действие с android.intent.action.MAIN фильтр в вашем AndroidManifest.xml, если приложение уже не запущено (в этом случае оно, очевидно, восстановит активность поверх стека).

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

Таким образом, в каждом действии вы хотите перезапустить автоматически:

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
    Editor editor = prefs.edit();
    editor.putString("lastActivity", getClass().getName());
    editor.commit();
}

А действия диспетчера похожи на следующее:

public class Dispatcher extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Class<?> activityClass;

        try {
            SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
            activityClass = Class.forName(
                prefs.getString("lastActivity", Activity1.class.getName()));
        } catch(ClassNotFoundException ex) {
            activityClass = Activity1.class;
        }

        startActivity(new Intent(this, activityClass));
    }
}

замечания

  • Вы можете создать базовый класс для onPause переопределение
  • Деятельность диспетчера, очевидно, должна быть android.intent.action.MAIN действие

Это не так сложно. Вам просто нужно манипулировать манифестом.

AndroidManifest.xm

<activity
     android:name=".MainActivity"
     android:alwaysRetainTaskState="true"
     android:exported="true"
     .
     .
     .

Прочтите об 'android:exported' & 'android:alwaysRetainTaskState' здесь:

андроид: экспортироваться

андроид: alwaysRetainTaskState

Это поведение по умолчанию, и этот вопрос задавался несколько раз ранее: Android: сохранить стек задач после перезапуска из HOME.
Android Запустите приложение из последней активности

Обратите внимание: если вы запускаете свое приложение из Eclipse, это нарушает функциональность по умолчанию. Изменение конфигурации запуска для запуска без действий должно исправить ситуацию.

Однако, поскольку это поведение было исправлено в выпуске 0.9.6 плагина ADT для Eclipse в последние несколько недель, вам больше не нужен этот обходной путь:

Приложения, запущенные из ADT, теперь ведут себя так, как если бы они были нажаты на главном экране.

Другие вопросы по тегам