Завершить любое предыдущее действие в стеке из текущего действия? - PullRequest
11 голосов
/ 27 апреля 2010

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

Ответы [ 4 ]

28 голосов
/ 26 февраля 2012

Я знаю, что этот ответ может быть поздно, но я все равно собираюсь опубликовать его на случай, если кто-то ищет что-то подобное.

Я объявил статический обработчик в ACTIVITY_A

.
public static Handler h;

и в моем onCreate() методе для ACTIVITY_A у меня есть

h = new Handler() {

        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch(msg.what) {

            case 0:
                finish();
                break;

            }
        }

    };

Теперь от любой деятельности после этой, такой как ACTIVITY_B или ACTIVITY_C, я могу позвонить

ACTIVITY_A.h.sendEmptyMessage(0);

, который затем вызывает finish() в ACTIVITY_A и та-да! ACTIVITY_A закончен из другой деятельности.

3 голосов
/ 27 июля 2017

Так что я устал от этого, но не сработал после более глубокого тестирования (оставляю здесь для дальнейшего использования): android:clearTaskOnLaunch

Предположим, например, что кто-то запускает действие P с домашнего экрана и оттуда переходит к действию Q. Затем пользователь нажимает Home и затем возвращается к действию P. Обычно пользователь видит действие Q, так как это то, что они делали в последний раз в задаче П. Однако, если P установил для этого флага значение «true», все действия над ним (в данном случае Q) были удалены, когда пользователь нажал кнопку «Домой» и задача перешла в фоновый режим. Таким образом, пользователь видит только P при возврате к задаче.

https://developer.android.com/guide/topics/manifest/activity-element.html

UPDATE Это сработало

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
3 голосов
/ 27 апреля 2010

Вы можете использовать флаг Intent FLAG_ACTIVITY_CLEAR_TOP, чтобы перезапустить действие из стека и очистить все, что было над ним. Это не совсем то, о чем вы просите, но это может помочь.

Для этого используйте:

Intent intent = new Intent(context, classToBeStarted.class);
intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
2 голосов
/ 19 декабря 2010

Это может быть возможно при использовании статических переменных. Например, используйте логическую переменную Activity_name_dirty = false; пометьте это как истинное, как только ваше состояние аннулирования этого конкретного действия происходит. Поэтому в любое время при вызове этого действия проверьте состояние activity_name_dirty. Затем вы можете использовать флаги активности, чтобы создать новый момент, как описано в Основы активности

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