Обратная навигация – это способ, с помощью которого пользователи перемещаются назад по истории ранее посещенных экранов. На всех устройствах Android есть кнопка "Назад", поэтому не добавляйте ее в интерфейс приложения. В зависимости от устройства Android пользователя эта кнопка может быть физической или программной.
Android поддерживает обратный стек пунктов назначения, когда пользователь перемещается по вашему приложению. Это позволяет Android правильно переходить к предыдущим пунктам назначения при нажатии кнопки "Назад". Однако в некоторых случаях для удобства пользователей может потребоваться реализовать собственное поведение кнопки "Назад".
Например, при использовании WebView вы можете переопределить поведение кнопки "Назад" по умолчанию, чтобы пользователь мог перемещаться назад по истории браузера, а не по предыдущим экранам в вашем приложении.
В Android 13 и более поздних версиях есть предпросмотр для жеста "Назад" для устройств Android. Подробнее о том, как добавить поддержку предпросмотра для жеста "Назад"…
Как реализовать собственную обратную навигацию
ComponentActivity – базовый класс для FragmentActivity и AppCompatActivity. Он позволяет управлять поведением кнопки "Назад" с помощью OnBackPressedDispatcher, который можно получить, вызвав getOnBackPressedDispatcher().
OnBackPressedDispatcher управляет тем, как события кнопки "Назад" отправляются одному или нескольким объектам OnBackPressedCallback. Конструктор OnBackPressedCallback принимает логическое значение для исходного состояния включения. Когда обратный вызов включен, то есть isEnabled() возвращает true, диспетчер вызывает handleOnBackPressed() обратного вызова, чтобы обработать событие кнопки "Назад". Изменить статус можно с помощью метода setEnabled().
Обратные вызовы добавляются с помощью методов addCallback. Рекомендуем использовать метод addCallback(), который принимает LifecycleOwner.
Это гарантирует, что OnBackPressedCallback будет добавляться только в том случае, если LifecycleOwner – это Lifecycle.State.STARTED.
Действие также удаляет зарегистрированные обратные вызовы, когда связанный с ними объект LifecycleOwner уничтожается. Это предотвращает утечки памяти и позволяет использовать LifecycleOwner во фрагментах и других владельцах жизненного цикла, которые существуют меньше, чем действие.
Пример реализации обратного вызова:
Kotlin
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback is only called when MyFragment is at least started val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
Java
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback is only called when MyFragment is at least started OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
Вы можете указать несколько обратных вызовов, используя addCallback().
В этом случае обратные вызовы вызываются в порядке, обратном порядку их добавления: обратный вызов, добавленный последним, первым получает возможность обработать событие кнопки "Назад". Например, если вы добавите три обратных вызова с именами one, two и three в указанном порядке, они будут вызваны в порядке three, two, one.
Обратные вызовы следуют шаблону Цепочка обязанностей. Каждый обратный вызов в цепочке вызывается, только если предыдущий обратный вызов не был включен. Это означает, что в предыдущем примере обратный вызов two выполняется, только если не включен обратный вызов three, а обратный вызов one – только если не включен обратный вызов two.
Обратите внимание, что при добавлении обратного вызова с помощью addCallback() он не добавляется в цепочку ответственности, пока LifecycleOwner не перейдет в состояние Lifecycle.State.STARTED.
Для временных изменений рекомендуем менять статус включения в OnBackPressedCallback, так как это позволяет сохранить описанный выше порядок.
Это особенно важно, если у вас есть обратные вызовы, зарегистрированные для нескольких вложенных владельцев жизненного цикла.
Если вы хотите полностью удалить OnBackPressedCallback, вызовите метод remove().
Обычно это не требуется, поскольку обратные вызовы автоматически удаляются при уничтожении связанного с ними объекта LifecycleOwner.
Activity onBackPressed()
Если вы используете onBackPressed() для обработки событий кнопки "Назад", рекомендуем вместо этого использовать OnBackPressedCallback.
Если вы не можете этого сделать, действуют следующие правила:
- Все обратные вызовы, зарегистрированные через
addCallback, оцениваются при вызовеsuper.onBackPressed(). - В Android 12 (уровень API 32) и более ранних версиях всегда вызывается
onBackPressed, независимо от зарегистрированных экземпляровOnBackPressedCallback.