Как очистить стек 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.

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

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

 @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 минут бездействия от пользователя.

Затем просто позвоните в конец (), когда будет успешный вход в систему.

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

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

В соответствии с Wakka в разделе Удаление из истории стека …


Добавьте в AndroidManifest.xml атрибут android:noHistory="true" следующим образом:

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

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

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

Попробуй это

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

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