Представьте себе этот стек истории действий:
A> B> C> D> E
сценарий 1:
Если пользователь находится на E, то, нажав кнопку "назад", он должен перейти к D> C> B> A.
сценарий 2:
Если пользователь находится на E, то при нажатии пользовательской кнопки "Показать B", он должен очистить E> D> C. Что похоже на Finish().
Как X> Y, если мы установим финиш на Y, будет отображаться X. Похоже, если я записываю Show B на E, тогда E> D> C следует удалить из стека.
Мне нужно достичь обоих сценариев.
(Отредактировано ^^^^ со сценариями)
Если пользователь находится на E активности и хочет переместить B. Если B находится в стеке истории, мы можем очистить C> D> E, чтобы пользователь мог перейти к B без startActivity (B). и А должно быть в истории.
Если действие доступно в стеке, то оно должно загружаться из истории, если не startActivity (B).
Если я использую FLAG_ACTIVITY_CLEAR_TOP/FLAG_ACTIVITY_NEW_TASK, он очистит всю историю и начнет новую деятельность.
Я хочу очистить частичную историю.
Будет ли возможно достичь? Если да, то как это сделать, пожалуйста?
Это все довольно стандартно. Не используйте никаких специальных режимов запуска. Обычно нажатие НАЗАД просто завершает текущую Activity
и возвращает вас к предыдущей.
Для этого случая:
Если пользователь находится на E, то при нажатии пользовательской кнопки "Показать B", он должен очистить E> D> C. Что похоже на Finish().
В E
, чтобы вернуться к существующему экземпляру B
, сделайте это:
Intent intent = new Intent(this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
Это завершит E, D и C и вернется к существующему экземпляру B.
Флаг FLAG_ACTIVITY_CLEAR_TOP
указывает Android очистить все действия между текущей Activity
и целевой Activity
. Если вы не укажете FLAG_ACTIVITY_SINGLE_TOP
то существующий экземпляр целевой Activity
также будет закончен, и новый экземпляр будет создан. Если указать FLAG_ACTIVITY_SINGLE_TOP
то существующий экземпляр целевой Activity
НЕ будет закончен, и новый экземпляр не будет создан.
Вы можете достичь этого, используя
android:launchMode="singleTask"
в вашем файле манифеста. Для получения дополнительной информации обратитесь к этой документации https://android.jlelse.eu/android-activity-launch-mode-e0df1aa72242
singleTask
илиsingleInstance
. Это создает больше проблем, чем решает, побочные эффекты недостаточно хорошо документированы или недооценены, и они не нужны в 99% случаев. Это плохой совет.