Android: очистить стек активности

У меня есть несколько действий в моем приложении. И поток очень сложный. Когда я нажимаю приложение Logout naviagates для входа в экран входа в систему, и оттуда пользователь может выйти с помощью отмены бутона (вызов system.exit(0) )

Когда я выхожу из или назад, система вызывает действие из стека: (как я могу очистить все действия в стеке, когда я нахожусь на экране входа в систему? Call finish() не является практичным, так как существует так много действий, и некоторые действия не должны быть Закрыты, когда они активны, например, активность активации вызываемой камеры.

 validateuser logoutuser = new validateuser(); logoutuser.logOut(); Intent loginscreen = new Intent(homepage.this, Login2.class); (homepage.this).finish(); loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(loginscreen); 

Solutions Collecting From Web of "Android: очистить стек активности"

Большинство из вас ошибаются. Если вы хотите закрыть существующий стек операций независимо от того, что там есть и создать новый корень, правильный набор флагов следующий:

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

Из документа :

public static final int FLAG_ACTIVITY_CLEAR_TASK
Добавлено в API уровня 11

Если задано в Intent, переданном Context.startActivity() , этот флаг вызовет любую существующую задачу, которая будет связана с активностью, которая должна быть очищена до начала действия. То есть, деятельность становится новым корнем пустой задачи, и все старые действия завершены. Это можно использовать только совместно с FLAG_ACTIVITY_NEW_TASK .

Когда вы вызываете startActivity для последнего действия, вы всегда можете использовать

Intent.FLAG_ACTIVITY_CLEAR_TOP

Как флаг этого намерения.

Подробнее о флагом здесь .

Вот простой вспомогательный метод для запуска нового действия в качестве новой верхней активности, которая работает с уровня API 4 до текущей версии 17:

 static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) { Intent intent = new Intent(currentActivity, newTopActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11 currentActivity.startActivity(intent); } 

Назовите это так из вашей текущей деятельности:

 startNewMainActivity(this, MainActivity.class); 

Очистить Деятельность Backstate по коду:

 Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Готово

В моем случае LoginActivity также был закрыт. В результате,

 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK 

не помогло.

Однако установка

 Intent.FLAG_ACTIVITY_NEW_TASK 

помог мне.

 Intent intent = new Intent(LoginActivity.this, Home.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //It is use to finish current activity startActivity(intent); this.finish(); 

Я отметил, что вы попросили решение, которое не полагается на finish() , но мне интересно, может ли это тем не менее помочь.

Я отслеживал, возникает ли флаг выхода с переменной статического класса, которая выживает в течение всего срока службы приложения. В каждом релевантном onResume() используйте

 @Override public void onResume() { super.onResume(); if (ExitHelper.isExitFlagRaised) { this.finish(); } } 

Класс ExitHelper

 public class ExitHelper { public static boolean isExitFlagRaised = false; } 

Скажем, в mainActivity пользователь нажимает кнопку для выхода – вы можете установить ExitHelper.isExitFlagRaised = true; И затем finish() . После этого будут завершены другие соответствующие виды деятельности, которые будут возобновлены автоматически.