Как очистить Android Stack от активности? - PullRequest
53 голосов
/ 16 ноября 2010

У меня есть приложение с несколькими операциями в Android, и я хочу, чтобы пользователь мог выйти из системы, нажав кнопку меню.У меня проблема в том, что

A) Android не позволяет завершить работу приложения и
B), даже когда я снова отправляю пользователя на LoginActivity, они всегда могут нажать назад и вернитесь к предыдущему действию, в котором они находились.

Я уже пытался запустить действие с двумя следующими флагами:

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

Я также пытался с каждым из них

Я также пытался позвонить finish() после startActivity(intent), как я прочитал в другом вопросе StackOverflow.

Ответы [ 10 ]

42 голосов
/ 02 декабря 2010

Это должно быть побитовое ИЛИ или вы в итоге перезаписываете предыдущий флаг.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Вот так:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
35 голосов
/ 16 ноября 2010

При входе в систему переопределите кнопку «Назад», чтобы она не закрывала ваше приложение, вместо того, чтобы завершать действие:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Также обязательно установите android: alwaysRetainTaskState = "true" в корневой активностипоэтому Android не очищает ваш стек (включая действия при входе в систему) после 30 минут бездействия пользователя.

Затем просто вызовите finish () при успешном входе в систему.

31 голосов
/ 22 августа 2012

Согласно Wakka в Удаление активности из стека истории ...


Добавьте атрибут android:noHistory="true" к вашему <activity> вAndroidManifest.xml как это:

<activity android:name=".MyActivity"
    android:noHistory="true">
</activity>
6 голосов
/ 03 марта 2012

Если вы используете Android API 11 или выше, вы можете использовать следующий код для очистки стека.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
5 голосов
/ 16 июля 2013

Это не очистит ваш стек задних действий.

Даже после выполнения всех вышеприведенных ответов, когда я нажимал кнопку «Назад», на экране отображалось последнее действие в течение секунды перед закрытием приложения.

Это то, что я сделал:

@Override
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

Теперь мое приложение завершается при нажатии на кнопку :) без каких-либо хлопот.

3 голосов
/ 16 ноября 2010

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

2 голосов
/ 17 декабря 2012

Эта работа для меня:)

Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
    | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);

Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();

Где A - моя корневая активность, например

У меня есть действия A -> B -> C -> D, когда я вызываю стартовое действие E в стеке, у меня сейчас A -> E

Не знаю, хорошо ли это :), но работает.

1 голос
/ 06 января 2015

Попробуйте это

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK | 
    Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
1 голос
/ 21 мая 2012
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

напишите это и обратите внимание: LoginActivity должен быть сначала запущен как Launcher, а

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

0 голосов
/ 25 июля 2014

Если мы используем этот код для запуска действия входа (A):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

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

Если мы будем использовать finish () в операции входа в систему (A), после запуска операции (B) (чтобы избежать возврата к A из B) операция A (регистрация) не будет в стеке.Точно так же происходит, когда действие входа в систему имеет атрибут «noHistory» в качестве атрибута.

Итак, решение для меня было смесью других ответов:

Этот код входит в действие B, чтобывернитесь к операции входа в систему:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
    super.onBackPressed();
}

И этот код входит в действие, которое вызывает функцию выхода из системы:

public static void logout() {
    Intent intent = new Intent(activity, LoginMain.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}
...