轉載請註明出處:王亟亟的大牛之路
開篇之前日常安利
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開發
標準五險一金(不避稅)
不強制加班,彈性工作
有意向的可以加我微信,必須註明來意