Android: очистить задний стек - PullRequest
304 голосов
/ 26 апреля 2011

В Android у меня есть некоторые действия, скажем, A, B, C.

В A я использую этот код для открытия B:

Intent intent = new Intent(this, B.class);
startActivity(intent);

В B я использую этокод для открытия C:

Intent intent = new Intent(this, C.class);
startActivity(intent);

Когда пользователь нажимает кнопку в C, я хочу вернуться к A и очистить задний стек (закройте оба B и C).Поэтому, когда пользователь нажимает кнопку «В», B и C не отображаются, я пытаюсь сделать следующее:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

Но B и C все еще отображаются, если я нажимаю кнопку «Назад», когдаВернемся к занятию А. Как я могу избежать этого?

Ответы [ 35 ]

0 голосов
/ 27 сентября 2016

В декларации

android:launchMode="singleTask"

и

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
0 голосов
/ 15 марта 2019

Вот как я решил проблему:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}
0 голосов
/ 18 сентября 2017

Это действительно старый ответ, и я не нашел правильного решения, с единственной целью очистить backStack, я решил создать свой собственный backstack, который даже не является стеком tbh, но он неТак не должно быть, так как мы все равно хотим очистить все в нем;

Сверху всегда приходится снимать с рук бэкстэк, но это дало мне контроль, который мне был нужен;


СначалаОбъявите открытый статический список действий (или фрагментов, что вам нужно);

public static ArrayList <Activity> backStack = new ArrayList<>();

И внутри метода onCreate всех других действий:

MainActivity.backStack.add(this);

И, наконец, когда вы хотите очиститьbackstack, просто позвоните:

public static void killBackStack () {
    for (Activity ac : backStack) {
        if (ac != null)
            ac.finish();
    }
}
0 голосов
/ 08 июля 2019

Этот код работает для меня в kotlin:

 val intent = Intent(this, MainActivity::class.java)
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
 startActivity(intent)
 finish()
0 голосов
/ 01 апреля 2016

Либо добавьте это к своим Activity B и Activity C

android:noHistory="true"

или Override onBackPressed функция, чтобы избежать обратного нажатия с return.

@Override
public void onBackPressed() {
   return;
}
...