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