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