原理
通過解析定義在xml布局的各個節(jié)點的視圖關(guān)系,進行頁面跳轉(zhuǎn)時調(diào)用原生API進行頁面切換(Fragment:FragmentManager,Activity Intent)
UML圖
核心類
1:NavGraphFragment
(1)作為Fragment導航界面的載體
(2)管理并控制導航的行為(委托給NavController)
(3)導航關(guān)系的入口

創(chuàng)建時機最早,在NavInflater解析的時候通過反射創(chuàng)建,這個類僅僅作為Fragment導航界面的載體,并沒有實際承擔導航行為,而是將并將導航行為 委托 NavController的實例。
NavController什么時機創(chuàng)建的?一個NavGraphFragment有幾個NavController,怎么個對應關(guān)系?
在onCreate創(chuàng)建

通過根布局的 tag對應

一個NavGraphFragment只有一個NavController

findNavController(View)內(nèi)部實現(xiàn)是通過 遍歷 View樹,直到找到最底部NavHostFragment 中的NavController對象,并將其返回的,NavHostFragment 在其 作用域 內(nèi),理應 有且僅有一個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來執(zhí)行具體的popBackStack()和navigation()

3:Navigator和NavDestination
Navigator(導航者) 的職責很單純:
(1).能夠?qū)嵗瘜?NavDestination
(2).能夠指定導航
(3).能夠后退導航

NavDestination代表導航視圖中的任一一個導航的節(jié)點(FragmentNavigator.Destination和ActivityNavigator.Destination),每種和對應的Navigator關(guān)聯(lián),內(nèi)部類,主要存儲一些Action的信息.

(4):Navigation:對外暴露的API入口,提供NavController的靜態(tài)方法

5:其他類
(1) NavInflater:布局解析,初始化各個NavDestination
(2) NavigationProvider:NavigationProvider存儲 Navigator
6 :借鑒之處
(1)類職責劃分清晰
(2)面向接口,擴展性強