「返回導覽」指的是使用者依據先前造訪的畫面記錄往回導覽。所有 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。