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
таким образом, что он не был предназначен для использования.
Возможно, лучший способ сделать это - использовать приемники вещания, как показано здесь:
Смотрите эти темы и для других методов:
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);