Как очистить стек 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
вопрос.
Ответы
Ответ 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);
Ответ 3
Как Wakka в Удаление активности из стека истории...
Добавьте android:noHistory="true"
атрибут <activity>
в AndroidManifest.xml
следующим образом:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
Ответ 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);
}