概念介紹:
- ReactContext:繼承自ContextWrapper,是ReactNative應(yīng)用的上下文
- ReactInstanceManager: 是ReactNative應(yīng)用的管理類,負(fù)責(zé)創(chuàng)建ReactContext,CatalystInstance等。
- CatalystInstance:Java層、C++層、JS層通信總管理,管理Java層、JS層核心Module映射表和回調(diào),三端通信的入口于橋梁
RN應(yīng)用的啟動(dòng)流程如下圖所示:
image.png
詳細(xì)流程:
- 在程序啟動(dòng)的時(shí)候,也就是在ReactActivity的onCreate()方法中,我們創(chuàng)建一個(gè)ReactInstanceManager對(duì)象
- 創(chuàng)建ReactRootView(FrameLayout)調(diào)用ReactRootView.startReactApplication()方法啟動(dòng)應(yīng)用
- 在異步任務(wù)ReactContextInitAsyncTask中,創(chuàng)建ReactContext
- 在異步任務(wù)中,完成如下工作:
- 根據(jù)ReactPackage,創(chuàng)建JavaScriptModuleRegistry和NativeModuleRegistry注冊(cè)表
- 創(chuàng)建管理類CatalystInstanceImpl
- 創(chuàng)建JS、Native、與UI線程隊(duì)列
- 調(diào)用CatalystInstanceImpl.runJsBundle()加載JS bundle
- 后臺(tái)任務(wù)執(zhí)行完成后,會(huì)調(diào)用ReactInstanceManager.setupReactContext()設(shè)置創(chuàng)建好的ReactContext,并將ReactRootView加載進(jìn)去
- 調(diào)用RN應(yīng)用的JS入口AppRegistry來啟動(dòng)應(yīng)用
- JS層找到已經(jīng)注冊(cè)的啟動(dòng)組件,執(zhí)行renderApplication來渲染整個(gè)應(yīng)用
PS:
- 實(shí)際開發(fā)中,一般會(huì)寫一個(gè)單例來獲取ReactInstanceManger,多個(gè)ReactFragment和ReactActivity可以共享一個(gè)ReactInstanceManager