Android: удалить все предыдущие действия из заднего стека
Когда я нажимаю кнопку Выход из системы в своей профиле. Я хочу, чтобы пользователь заходил на страницу Войти, где ему нужно было использовать новые учетные данные.
Следовательно, я использовал этот код:
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
в onButtonClick
кнопки Logout.
Но проблема в том, что когда я нажимаю кнопку "Назад" на вкладке "Активность входа", она возвращает меня в ProfileActivity. Я ожидал, что приложение закроется, когда я нажму кнопку "Назад" на LoginActivity.
Что я делаю неправильно?
Я также добавил android:launchMode="singleTop"
в манифест для моей LoginActivity
Спасибо
Ответы
Ответ 1
Предлагаемое здесь решение сработало для меня:
Джава
Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
Котлин
val i = Intent(OldActivity.this, NewActivity::class.java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)
Однако для этого требуется уровень API> = 11.
Ответ 2
Вот одно решение для очистки всех ваших действий при использовании кнопки выхода из системы.
Каждый раз, когда вы начинаете действие, начинайте его следующим образом:
Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);
Если вы хотите закрыть все приложение, сделайте следующее:
setResult(RESULT_CLOSE_ALL);
finish();
RESULT_CLOSE_ALL - это окончательная глобальная переменная с уникальным целым числом, чтобы сигнализировать, что вы хотите закрыть все действия.
Затем определите обратный вызов любого действия onActivityResult(...)
, поэтому, когда действие возвращается с значением RESULT_CLOSE_ALL, оно также вызывает finish()
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode)
{
case RESULT_CLOSE_ALL:
setResult(RESULT_CLOSE_ALL);
finish();
}
super.onActivityResult(requestCode, resultCode, data);
}
Это приведет к каскадному эффекту, который закрывает все ваши действия.
Однако это взлом и использует startActivityForResult
таким образом, чтобы он не был предназначен для использования.
Возможно, лучший способ сделать это - использовать широковещательные приемники, как показано здесь:
При выходе из системы очистите стек истории событий, предотвратив "назад" . от открытия только активированных в сеансе действий
Смотрите также эти темы для других методов:
Android: очистить задний стек
Завершить все предыдущие действия
Ответ 3
Чтобы полностью очистить стек активности, вы хотите создать новый стек задач с помощью TaskStackBuilder, например:
Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();
Это не только создаст новый, чистый стек задач, но также позволит корректно работать с кнопкой "вверх", если ваш LoginActivity имеет родительскую активность.
Ответ 4
finishAffinity()
добавлено в API 16. Используйте ActivityCompat.finishAffinity()
в предыдущих версиях. Когда вы запустите любое действие, используя намерение и закончите текущее действие. Теперь используйте ActivityCompat.finishAffinity()
вместо finish()
. он завершит всю сложенную активность ниже текущей активности. Он отлично работает для меня.
Ответ 5
Что сработало для меня
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Ответ 6
Для API 11+ вы можете использовать Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
следующим образом:
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
Он полностью очистит все предыдущие действия и начнет новую деятельность.
Ответ 7
Одно из возможных решений, которое я могу вам предложить, - добавить android:launchMode="singleTop"
в манифест для моей ProfileActivity. и при выходе из системы вы можете выйти из системы, начиная с вас LoginActivity.
на выходе вы можете вызвать это.
Intent in = new Intent(Profile.this,Login.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(in);
finish();
Ответ 8
Вы можете попробовать finishAffinity()
, он закрывает все текущие действия и работает над Android 4.1
Ответ 9
Я также сталкиваюсь с той же проблемой.
в активности входа, что я делаю.
Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
finish();
MainActivity.this.startActivity(myIntent);
при выходе из системы
Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
finish();
ActivityLoggedIn.this.startActivity(myIntent);
Это хорошо работает, но когда я нахожусь в ActivityLoggedIn, и я минимизирую приложение и нажимаю значок кнопки запуска в ящике приложения, MainActivity снова запускается: -/я использую флаг
android:LaunchMode:singleTask
для MainActivity.
Ответ 10
Используйте следующее для activity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
убрать флаг CLEAR_TASK для использования фрагмента.
Я надеюсь, что это может использовать для некоторых людей.
Ответ 11
Просто держись
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Ответ 12
На уровне API 11 или выше используйте FLAG_ACTIVITY_CLEAR_TASK
и FLAG_ACTIVITY_NEW_TASK
в Intent для очистки всего стека активности.
Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
Ответ 13
Ни один из флагов намерения не работал у меня, но я это исправил:
Когда пользователь подписывается из одного действия, мне приходилось транслировать сообщение из этого действия, а затем получать его в тех действиях, которые я хотел закрыть, после чего я вызываю finish(); и он работает очень хорошо.
Ответ 14
Попробуйте это, он будет работать:
Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
Ответ 15
Использовать этот
Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();