Подтвердить что ты не робот

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

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

A) Android не позволяет прекратить действие приложения и B), даже когда я снова отправлю пользователя в 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), как я прочитал в другом StackOverflow вопрос.

4b9b3361

Ответ 1

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

@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(), когда есть успешный вход в систему.

Ответ 2

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

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

Ответ 4

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

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

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

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

Если мы используем функцию finish() в активности входа (A), после запуска активности (B) (чтобы избежать возврата к A из B), активность A (Login) не будет находиться в стеке. Точно так же происходит, когда в активности входа в качестве атрибута "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);
}