React Native安卓實現分析之ReactInstanceManager的包裝類ReactNativeHost
轉載請註明出處:王亟亟的大牛之路
開篇之前日常安利
Android" rel="nofollow,noindex" target="_blank">https://github.com/ddwhan0123/Useful-Open-Source-Android (各種庫的收納,長期維護)
上一篇提到了UI容器類ReactRootView,這一次繼續我們的分析之路
寫著一片之前,沒有看過任何其他兄弟對相關內容的分析,不是覺得自己牛逼。
是怕別人的思維影響到我的理解,如果講得不對,歡迎指出!
上一篇的傳送門 React Native安卓實現分析之ReactRootView的實現過程
ReactNativeHost
ReactNativeHost應該是我們在學習RN專案之初最初接觸到的幾個類之一,他在初始化專案Application的時候被用到,常用的方法有 getUseDeveloperSupport() getPackages() getJSBundleFile()
等,既然是一個常用的類我們就看下他的實現
他是一個抽象類,也就實現的方法。
在我們業務的Application裡做的各種賦值的操作,都是為了給ReactApplication的getReactNativeHost()方法使用
繼而在建立RNActivity的onCreate() 方法的時候建立/獲取ReactNativeHost中ReactInstanceManager的例項,以下為剛才提到的一些業務場景
public abstract class ReactNativeHost {...}
業務Application只要實現ReactApplication就會呼叫的方法
@Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; }
RNActivity的onCreate() 中建立ReactInstanceManager例項
((RNApp) getApplication()).getReactNativeHost().getReactInstanceManager();
getJSBundleFile()
在ReactNativeHost的getJSBundleFile()我們返回包中bundler的地址,通常是放在預設值或者自己放的一個拓展地址裡,或者使用CodePush,像這樣
自定義地址場景
@Override protected @Nullable String getJSBundleFile() { String jsBundleFile = getFilesDir().getAbsolutePath() + "/index.android.bundle"; File file = new File(jsBundleFile); return file != null && file.exists() ? jsBundleFile : null; }
使用CodePush的場景
實質為 assets://index.android.bundle
的地址
@Override protected String getJSBundleFile() { return CodePush.getJSBundleFile(); }
getUseDeveloperSupport()
返回一個boolean型別的結果,如果為true,支援reload Js
getPackages()
它是一個 List<ReactPackage>
型別的容器,我們專案用到的所有Package都回家在裡面,如FB提供的 MainReactPackage
和我們用到的CodePush的和一些自定義元件的Package
public class MainReactPackage extends LazyReactPackage {...}
public class CodePush implements ReactPackage {...}
public class RCTToastPackage implements ReactPackage{...}
最終他會在我們建立 ReactInstanceManager
時進行裝箱
//...省略內容 for (ReactPackage reactPackage : getPackages()) { builder.addPackage(reactPackage); }
createReactInstanceManager()
protected ReactInstanceManager createReactInstanceManager() { ReactInstanceManagerBuilder builder = ReactInstanceManager.builder() .setApplication(mApplication)//設定關聯的Application物件 .setJSMainModulePath(getJSMainModuleName())//設定主MoudleName 其實就是index.android .setUseDeveloperSupport(getUseDeveloperSupport())//設定是否debug .setRedBoxHandler(getRedBoxHandler())//紅盒的回撥 .setJavaScriptExecutorFactory(getJavaScriptExecutorFactory())//js執行的工廠類 .setUIImplementationProvider(getUIImplementationProvider())//官方建議不使用自定義的UI實現 .setInitialLifecycleState(LifecycleState.BEFORE_CREATE);//設定建立時機 for (ReactPackage reactPackage : getPackages()) { builder.addPackage(reactPackage); } String jsBundleFile = getJSBundleFile(); if (jsBundleFile != null) { builder.setJSBundleFile(jsBundleFile); } else { builder.setBundleAssetName(Assertions.assertNotNull(getBundleAssetName())); } return builder.build(); }
它構建了一個基礎的 ReactInstanceManager
ReactInstanceManager是總的管理類,管理ReactPackage,管理ReactRootView,控制生命週期。
總結:
這一篇篇幅比較短,介紹了ReactNativeHost 這個抽象類
它主要的功能是為內部建立的ReactInstanceManager獲取必要的業務屬性,ReactInstanceManager建立後才是 真正RN應用的啟動

插一段廣告
蔚來汽車
上海 安亭/徐家彙/漕河涇 (安亭有班車)
收Android/iOS/.Net/Java/Vue/RN開發
標準五險一金(不避稅)
不強制加班,彈性工作
有意向的可以加我微信,必須註明來意
