Обеспечьте настраиваемую обратную навигацию

Обратная навигация – это способ перемещения пользователей назад по истории посещенных ими ранее экранов. На всех устройствах 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 пригодным для использования во фрагментах или других владельцах жизненного цикла, время жизни которых короче, чем у действия.

Вот пример реализации обратного вызова:

Котлин

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
    }
    ...
}

Ява

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 .

Активность onBackPressed()

Если вы используете onBackPressed() для обработки событий кнопки «Назад», мы рекомендуем вместо этого использовать OnBackPressedCallback . Однако если вы не можете внести это изменение, применяются следующие правила:

  • Все обратные вызовы, зарегистрированные через addCallback , оцениваются при вызове super.onBackPressed() .
  • В Android 12 (уровень API 32) и более ранних версиях onBackPressed вызывается всегда, независимо от каких-либо зарегистрированных экземпляров OnBackPressedCallback .