原理
通過解析定義在xml布局的各個節點的視圖關系,進行頁面跳轉時調用原生API進行頁面切換(Fragment:FragmentManager,Activity Intent)
UML圖
核心類
1:NavGraphFragment
(1)作為Fragment導航界面的載體
(2)管理并控制導航的行為(委托給NavController)
(3)導航關系的入口
創建時機最早,在NavInflater解析的時候通過反射創建,這個類僅僅作為Fragment導航界面的載體,并沒有實際承擔導航行為,而是將并將導航行為 委托 NavController的實例。
NavController什么時機創建的?一個NavGraphFragment有幾個NavController,怎么個對應關系?
在onCreate創建
通過根布局的 tag對應
一個NavGraphFragment只有一個NavController
findNavController(View)內部實現是通過 遍歷 View樹,直到找到最底部NavHostFragment 中的NavController對象,并將其返回的,NavHostFragment 在其 作用域 內,理應 有且僅有一個NavController 的實例。
2:NavController: 導航行為的管家
(1).對navigation資源文件夾下nav_graph.xml的 解析
(2).通過解析xml,獲取所有 Destination(目標點)的 引用 或者 Class的引用
(3).記錄當前棧中 Fragment的順序
NavController 持有了一個 NavInflater ,并通過 NavInflater 解析xml文件。
這之后,獲取了所有 Destination(在本文中即Page1Fragment , Page2Fragment , Page3Fragment ) 的 Class對象,并通過反射的方式,實例化對應的 Destination,通過一個隊列保存. 提供了navigation(),onHandleDeepLink(),popBackStack()
NavController 獲取了所有 NavDestination 的Class對象,但是我不負責它 如何實例化 ,也不負責 如何導航 ,也不負責 如何后退 最后通過FragmentNavigator來執行具體的popBackStack()和navigation()
3:Navigator和NavDestination
Navigator(導航者) 的職責很單純:
(1).能夠實例化對應的 NavDestination
(2).能夠指定導航
(3).能夠后退導航
NavDestination代表導航視圖中的任一一個導航的節點(FragmentNavigator.Destination和ActivityNavigator.Destination),每種和對應的Navigator關聯,內部類,主要存儲一些Action的信息.
(4):Navigation:對外暴露的API入口,提供NavController的靜態方法
5:其他類
(1) NavInflater:布局解析,初始化各個NavDestination
(2) NavigationProvider:NavigationProvider存儲 Navigator
6 :借鑒之處
(1)類職責劃分清晰
(2)面向接口,擴展性強