Android: очистить задний стек
В Android у меня есть некоторые действия, скажем, A, B, C.
В A я использую этот код, чтобы открыть B:
Intent intent = new Intent(this, B.class);
startActivity(intent);
В B я использую этот код, чтобы открыть C:
Intent intent = new Intent(this, C.class);
startActivity(intent);
Когда пользователь нажимает кнопку в C, я хочу вернуться к A и очистить задний стек (закрыть B и C). Поэтому, когда пользователь нажимает кнопку возврата B и C не отображаются, я пробовал следующее:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Но B и C по-прежнему отображаются, если я использую кнопку "Назад", когда я возвращаюсь к занятию А. Как я могу избежать этого?
Ответы
Ответ 1
Попробуйте добавить FLAG_ACTIVITY_NEW_TASK
, как описано в документах для FLAG_ACTIVITY_CLEAR_TOP
:
Этот режим запуска также можно использовать для хороший эффект в сочетании с FLAG_ACTIVITY_NEW_TASK: если используется начать корневую деятельность задачи, она приведет к запуску в текущий момент экземпляр этой задачи для на переднем плане, а затем очистить его корневое состояние. Это особенно полезно, например, при запуске деятельность из уведомления менеджер.
Итак, ваш код для запуска A
будет следующим:
Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish(); // call this to finish the current activity
Ответ 2
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Ответ 3
Как добавить в файл манифеста для связанной деятельности:
android:noHistory="true"
для определения активности B и C? Они не будут добавлены в заднюю часть. Не уверен, что это то, что вы хотите.
Ответ 4
Это беспокоит меня в течение долгого времени. Наконец, я решил это сделать:
В фрагменте используйте:
Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
В действии используйте (добавьте еще один флаг намерения Intent.FLAG_ACTIVITY_CLEAR_TASK
по сравнению с фрагментом):
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);
Ответ 5
- Добавить
android:launchMode="singleTop"
в элемент активности вашего манифеста для Activity A
- Затем используйте
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
и
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
при запуске Activity A
Это означает, что при запуске Activity A все задачи поверх него очищаются, так что A является верхним. Новый задний стек создается с помощью A в корне, а использование singleTop
гарантирует, что вы когда-либо запускаете A один раз (так как A теперь сверху, из-за ..._CLEAR_TOP
).
Ответ 6
Начиная с API 16 (Jelly Bean), вы можете просто вызвать finishAffinity()
.
Теперь вы также можете вызвать ActivityCompat.finishAffinity(Activity activity)
с помощью библиотеки совместимости.
Обязательно установите для параметра taskAffinity в манифесте имя пакета, уникальное для этой группы действий.
См. дополнительную информацию:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29
Ответ 7
Попробуйте использовать
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
а не
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Ответ 8
Если ваше приложение имеет минимальную версию sdk 16, вы можете использовать
finishAffinity()
Завершите это действие, а также все действия непосредственно под ним в текущей задаче с одинаковой близостью.
Это работа для меня
На экране "Платежный платеж" удалите все действия в обратном стеке,
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
Ответ 9
Как Wakka в Удаление активности из стека истории...
Добавьте android:noHistory="true"
атрибут <activity>
в AndroidManifest.xml
следующим образом:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
Ответ 10
Для будущих исследований попробуйте этот код.
Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
Ответ 11
Использовать finishAffinity(); в задаче C при запуске задачи A для очистки операций backstack.
Ответ 12
используйте этот код для запуска новой активности, а также закройте или уничтожьте все другие стеки или htc файлы.
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Ответ 13
Я нашел ответы здесь немного обманчивыми, потому что код в исходном вопросе, кажется, работает отлично для меня?
С A, являющимся активностью root, начиная с B или C только с FLAG_ACTIVITY_CLEAR_TOP удаляет B и C из заднего стека.
Ответ 14
Use finishAffinity() to clear all backstack with existing one.
Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C,
- Activity B will be finished / removing from stack.
- Activity A will be finished / removing from stack.
- Activity C will finished / removing from stack.
Ответ 15
Я нашел интересное решение, которое может помочь. Я сделал это в моем onBackPressed()
.
finishAffinity();
finish();
FinishAffinity
удаляет подключение существующего действия к его стеку. А потом финиш поможет вам выйти из этого занятия. Который в итоге выйдет из приложения.
Ответ 16
В котлине это почти так же, как в Java. Только | символ заменяется на или текст. Итак, написано like-
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
Ответ 17
Мне кажется, что вам нужно начать Activity C
с Activity B
с помощью startActivityForResult()
. Когда вы нажимаете кнопку в Activity C
, вызывайте setResult(RESULT_OK)
и finish()
, поэтому Activity C
завершается. В Activity B
вы можете ответить на onActivityResult()
, также вызвав finish()
на себя, и затем вы вернетесь к Activity A
.
Ответ 18
Intent.FLAG_ACTIVITY_CLEAR_TOP
не будет работать в этом случае. Используйте (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
Подробнее см. эту документацию.
Ответ 19
Я пробовал все решения, и никто не работал индивидуально для меня.
Мое решение:
Объявить Activity A
как SingleTop
с помощью [android:launchMode="singleTop"]
в манифесте Android.
Теперь добавьте следующие флаги при запуске A
из любого места. Он очистит стек.
Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();
Ответ 20
logout.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Ответ 21
Этот пример можно использовать для вызова Activity A
из Activity C
Intent loout = new Intent(context, LoginActivity.class);
loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(loout);
Ответ 22
для меня добавление Intent.FLAG_ACTIVITY_CLEAR_TASK
решило проблему
Intent i = new Intent(SettingsActivity.this, StartPage.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
Ответ 23
В дополнение к FLAG_ACTIVITY_CLEAR_TOP
вы можете попробовать добавить Intent.FLAG_ACTIVITY_SINGLE_TOP
:
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Ответ 24
Данный код работает правильно. Я пробовал в примере жизненного цикла приложения.
У меня нет B и C в заднем стеке после запуска активности A с флагом FLAG_ACTIVITY_CLEAR_TOP
Ответ 25
я назвал activity_name.this.finish()
после начала нового намерения, и это сработало для меня.
I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
Но это не сработает для меня... Я не предлагаю это решение для использования, но если флаг установки не будет работать для вас, вы можете попробовать это. Но все же я рекомендую не использовать его
Ответ 26
Добавить NO History Flag в намерении.
В активности B запустите действие C, как показано ниже → → →
Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();
Ответ 27
Либо добавьте это в свои Activity B
и Activity C
android:noHistory="true"
или Override
onBackPressed
, чтобы избежать повторного нажатия с помощью return
.
@Override
public void onBackPressed() {
return;
}
Ответ 28
В манифесте
android:launchMode="singleTask"
и
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Ответ 29
Использовать метод setFlags() для чистой обратной стороны, открыть все действия и запустить yourActvity
Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Ответ 30
Это сработало для меня с onBackPressed:
public void onBackPressed()
{
Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class);
Intent myIntent = new Intent(this, ImageUploadActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}