React Native安卓實現分析之ReactInstanceManager的包裝類ReactNativeHost
上一篇提到了UI容器類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開發
標準五險一金(不避稅)
不強制加班,彈性工作
有意向的可以加我微信,必須註明來意