как правильно очистить фоновую активность/активность из стека?

как говорится в заголовке вопроса, мне нужно знать, как лучше всего «удалить»/уничтожить/завершить действие, которое находится где-то в середине стека и в настоящее время находится в режиме паузы (не конкретные экземпляры, а конкретные производные классы).

например:
если текущее состояние стека выглядит так:

ActivityD   <-- top of the stack, currently forground
ActivityC
ActivityA
ActivityC
ActivityA

запрос на «очистку» всех экземпляров ActivityC приведет к тому, что стек будет выглядеть так:

ActivityD  <-- still top of the stack, currently forground.
ActivityA
ActivityA

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

что я в настоящее время знаю, что могу сделать, так это отправить трансляцию, которую будут прослушивать все действия, которые необходимо уничтожить, и вызвать Activity.finish() при получении трансляции.
это работает, но требует, чтобы получатели были зарегистрированы, даже когда их активность хостинга приостановлена, и я не уверен, что метод "finish()", вызванный из приостановленной активности, является правильным.

правильно ли вызывать метод Activity.finish() из возобновленной активности?

правильно ли зарегистрировать приемник в методе OnCreate() и отменить его регистрацию в OnDestroy()?

правильно ли обрабатывать трансляцию из возобновленной активности и с этого момента вызывать finish()?

есть ли «способ Android» или какой-то API, о котором я не знаю, чтобы очистить действия из стека?

заранее спасибо


person Tal Kanel    schedule 24.05.2012    source источник
comment
Это очень старый вопрос, но недавно мне было интересно то же самое. В частности, метод finish(), вызванный из приостановленной активности, является чем-то правильным. Вы имеете в виду метод Activity.finish() из активности paused? а не resumed?   -  person Teng-pao Yu    schedule 21.12.2018


Ответы (3)


Создайте собственный широковещательный приемник и зарегистрируйте его в каждом действии, которое может запускаться по выбранному вами событию. в onReceiveMethod каждого действия (можно выбрать) просто вызовите finish(). При этом ваши действия будут удалены из стека. Далее вы можете посетить это для получения дополнительной помощи: При выходе очистить стек истории действий, чтобы кнопка «Назад» не открывала действия только для входа в систему

person Awais Tariq    schedule 25.05.2012
comment
вы читали тело моего вопроса? как я уже писал - я пока использую это решение. Можете ли вы сказать мне, если по какой-то причине использование этого решения не заставит инженеров прошивки Android поднять коричневый глаз по поводу использования широковещательных приемников таким образом? - person Tal Kanel; 25.05.2012
comment
извините за это. Я не прочитал ваш вопрос должным образом. Насколько мне известно, такого пути нет. Но, скорее всего, я ошибаюсь. Во-первых, если вы хотите, чтобы действие не находилось в стеке, просто запустите его без свойства истории, его можно установить как с помощью кода, так и с помощью xml. - person Awais Tariq; 25.05.2012
comment
спасибо за ваш ответ, мне нужно, чтобы моя активность оставалась в стеке в некоторых точках, поэтому использование свойства no history для меня не вариант. если вы хотите услышать, я могу более конкретно описать ситуацию, из-за которой мне потребовалось это требование: мне нужно обрабатывать push-уведомления c2dm изнутри и снаружи приложения - открывать определенные экраны в соответствии с ним и при переходе к какой-либо активности - очистить все действия рядом с MainMenuActivity из стека - person Tal Kanel; 25.05.2012

У меня тоже была такая же проблема. Что я сделал, так это сохранил список статических массивов, и всякий раз, когда я переходил от одного действия к другому, в методе onCreate() нового действия я добавлял объект текущего действия в этот список следующим образом:

SomeClass.addActivity(CurrentActivity.this);

Я добавил приведенное выше утверждение в каждое действие.

ДобавитьАктивность():

public void addActivity(final Activity activity) {
            activityList.add(activity);
        }

И когда я хотел очистить стек, я вызывал:

public boolean clearStack() {
        for (Activity activity : activityList) {
            activity.finish();
        }
        activityList.clear();
        return (activityList.isEmpty());
    }

Таким образом, я очистил свой стек активности.

Спасибо :)

person Shrikant Ballal    schedule 24.05.2012
comment
ваше решение может работать, но это неправильный способ сделать это. Нехорошо хранить ссылки на действия... Это может легко вызвать утечку памяти. в любом случае спасибо за попытку помочь - person Tal Kanel; 24.05.2012

    Intent myintent = new Intent(YourCurrentActivity.this, YourNextActivitys.class);
    myintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(myintent);
    finish();

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

person V.J.    schedule 25.05.2012
comment
согласно: developer.android.com/reference/android/content/ это приведет к тому, что не только класс YourNextActivitys, но и все действия между ним и другим его экземпляром в стеке - person Tal Kanel; 25.05.2012