Как очистить стек Android-активности?

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

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

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

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) как я прочитал в другом вопросе Stackru.

10 ответов

Решение

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

@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() при успешном входе в систему.

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

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);

Согласно Aitor Gómez в Удаление деятельности из стека истории...


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

<activity android:name=".MyActivity"
    android:noHistory="true">
</activity>

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Это не очистит ваш стек активности.

Даже после выполнения всех приведенных выше ответов, когда я нажал кнопку "Назад", он показывал последнее действие за секунду до закрытия приложения.

Вот что я сделал:

@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);
}

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

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

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

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

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

Попробуй это

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);
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

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

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

Если мы используем этот код для запуска входа в систему (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);
}
Другие вопросы по тегам