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 кнопки выхода из системы.

Но проблема в том, что когда я нажимаю кнопку "Назад" на устройстве в разделе "Активность при входе в систему", это приводит меня к профилю деятельности. Я ожидал, что приложение должно закрыться, когда я нажму кнопку возврата устройства на LoginActivity.

Что я делаю неправильно?

Я также добавил android:launchMode="singleTop" в манифесте для моей LoginActivity

Благодарю вас

18 ответов

Решение

Решение, предложенное здесь, сработало для меня.

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

Однако для этого требуется уровень API>= 11.

Вот одно решение, чтобы очистить все действия вашего приложения, когда вы используете кнопку выхода из системы.

Каждый раз, когда вы начинаете действие, запускайте его так:

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: очистить задний стек

Завершить все предыдущие действия

finishAffinity() добавлено в API 16. Использование ActivityCompat.finishAffinity() в предыдущих версиях. Когда вы запустите любое действие, используя намерение и закончите текущее действие. Сейчас использую ActivityCompat.finishAffinity() вместо finish(), он завершит всю сложенную активность ниже текущей активности. Он отлично работает для меня.

Чтобы полностью очистить стек операций, вы хотите создать новый стек задач с помощью TaskStackBuilder, например:

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

Это не только создаст новый, чистый стек задач, но также позволит правильно функционировать кнопке "вверх", если у вашей LoginActivity есть родительская активность.

Что сработало для меня

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

Ты можешь попробовать finishAffinity(), он закрывает все текущие действия и работает на Android 4.1 и выше

Для 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);

Это полностью очистит все предыдущие действия и начнет новое действие.

Одно из возможных решений, которое я могу вам предложить, это добавить android:launchMode="singleTop" в манифесте для моей ProfileActivity. и когда вы выходите из системы, вы можете выйти из системы, начиная снова . при выходе из системы вы можете назвать это.

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();

Используйте следующее для activity

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

убрать флаг CLEAR_TASK для использования фрагмента.

Я надеюсь, что это может использовать для некоторых людей.

Продвинутый, повторно используемый Котлин:

Вы можете установить флаг напрямую, используя метод setter. В Котлинеorявляется заменой Java побитовой или|.

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

Если вы планируете использовать это регулярно, создайте функцию расширения Intent

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

Затем вы можете напрямую вызвать эту функцию перед запуском намерения

intent.clearStack()

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

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

Вы можете использовать метод ниже

          fun signOut(context: Context) {
        try {
                val intent = Intent(context, SplashActivity::class.java)
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
                context.startActivity(intent)
                (context as Activity).finishAffinity()
            }
        } catch (e: Exception) {
            LogUtils.logE("EXCEPTION", e)
        }

    }

Ни один из флагов намерений не работал для меня, но вот как я это исправил:

Когда пользователь выходит из одного действия, мне приходилось транслировать сообщение из этого действия, а затем получать его в действиях, которые я хотел закрыть, после чего я вызываю finish(); и это работает довольно хорошо.

На уровне 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);

Я также сталкиваюсь с той же проблемой..

в деятельности входа в систему, что я делаю.

    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 

для основной деятельности.

Попробуйте это, это будет работать:

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

Использовать этот

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

Добавить в манифест для вашей деятельности android:launchMode="singleTask"

Просто держи

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);
Другие вопросы по тегам