提供自訂的返回導覽功能

「返回導覽」指的是使用者依據先前造訪的畫面記錄往回導覽。所有 Android 裝置都有返回按鈕可執行這類瀏覽動作,因此請不要在應用程式 UI 中加入返回按鈕。視使用者的 Android 裝置而定,此按鈕可能是實體按鈕或軟體按鈕。

使用者在應用程式瀏覽各頁面時,Android 會保留目的地的「返回堆疊」。當使用者按下返回按鈕時,Android 會利用這項功能正確地前往先前的目的地。但在少數情況下,為了提供最佳使用者體驗,應用程式可能需要實作自己的返回行為。

舉例來說,使用 WebView 時 您可能會想要覆寫預設的返回按鈕行為,讓使用者 返回網頁瀏覽記錄,而不是之前的畫面 。

Android 13 以上版本支援 Android 裝置的預測返回手勢。如要進一步瞭解這項功能,請參閱「新增對預測返回手勢的支援」。

實作自訂返回瀏覽功能

ComponentActivity 是 FragmentActivity 及 AppCompatActivity 的基礎類別,可讓您透過 OnBackPressedDispatcher 控制返回按鈕的行為,該項目可透過呼叫 getOnBackPressedDispatcher() 取得。

OnBackPressedDispatcher 可控管系統如何將返回按鈕事件分派到一或多個 OnBackPressedCallback 物件。OnBackPressedCallback 的建構函式會以布林值表示初始啟用狀態。在啟用回呼的情況下 (即 isEnabled() 傳回 true),調度器會呼叫回呼的 handleOnBackPressed() 來處理返回按鈕事件。呼叫 setEnabled() 即可改變啟用狀態。

可透過 addCallback 方法新增回呼。建議選用會讀取 LifecycleOwner 的 addCallback() 方法。此方法可確保只有在 LifecycleOwner 為 Lifecycle.State.STARTED 時,才會新增 OnBackPressedCallback。當相關 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 的順序叫用。

回呼會依循責任鏈模式。除非前一個回呼未啟用,系統才會叫用鏈結中的回呼。也就是說,在前述範例中,只有在未啟用 three 回呼的情況下,系統才會叫用 two 回呼,而只有在未啟用 two 回呼的情況下,才會叫用 one 回呼。

請注意,透過 addCallback() 新增回呼時,只有當 LifecycleOwner 進入 Lifecycle.State.STARTED 狀態後,回呼才會新增至責任鏈。

針對臨時性的變更,建議您變更 OnBackPressedCallback 上的已啟用狀態,因為這個做法會保持上述順序。如果回呼是由多個不同的巢狀生命週期擁有者註冊,就必須特別注意這一點。

如要徹底移除 OnBackPressedCallback,您可以呼叫 remove()。但通常不需要這麼做,因為系統刪除與回呼相關聯的 LifecycleOwner 時,會自動移除回呼。

BackPressed() 活動

如果您使用 onBackPressed() 處理返回按鈕事件,建議改用 OnBackPressedCallback。不過若無法進行此項變更,則套用下列規則:

  • 所有透過 addCallback 註冊的回呼均會在您呼叫 super.onBackPressed() 時進行評估。
  • 在 Android 12 (API 級別 32) 以下版本中,無論 OnBackPressedCallback 的註冊例項為何,一律會呼叫 onBackPressed。