1.什麼是ReactNativeHost
ReactNativeHost是ReactNativeInstanceManager的土壤,爲ReactNativeInstanceManager提供一定的環境,相當於裝箱操作,幫你管理ReactInstanceManager。
2.什麼時間創建?
在創建React Native項目的時候會自動幫你創建ReactNativeHost,這個小可愛在什麼地方呢,如果你打開APP的Application就會驚奇的發現這個小可愛,通過getApplication,你可以隨時拿到ReactNativeHost,先看下ReactNativeHost內部都有什麼方法
private final ReactNativeHost mjtReactNativeHost = new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected String getJSBundleFile() {
return super.getJSBundleFile();
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.asList(
new MainReactPackage(),
...
);
}
@Override
protected String getJSMainModuleName() {
return "index";
}
@Override
protected String getBundleAssetName() {
return "index.mjt.android.bundle";
}
};
ReactNativeHost 包含的方法有
getUseDeveloperSupport() 設置是否支持通過搖晃手機彈出React Native開發者模式
getJSBundleFile() 獲取項目Assests下的Bundle文件,這個Bundle裏邊是ReactNative代碼。
getPackages() 包含多個ReactPackage,每個ReactPackage包含多個ReactModule,每個Module中是Java與JS通信的代碼。
getJSMainModuleName()
getBundleAssetName()
它會幫你創建一個單例:ReactInstanceManager 作爲管理器。ReactNativeHost還可以配置一系列的行爲,其中最關鍵的,便是getPackages接口。
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
protected List<ReactPackage> getPackages() {
return Arrays.asList(
new MainReactPackage(),
...
);
}
};
getPackages 接口返回了一系列的ReactPackage類,ReactPackage可以看作是,向ReactNative註冊了原生模塊,這樣在JS中你也可以使用原生模塊的功能。
下邊介紹下ReactPackage,先看個例子
public class LoginPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new LoginModule(reactContext));
return modules;
}
...
}
ReactPackage中承載了多個Module,每個Module都是具體的功能實現。
Module中你可以通過@ReactMethod註解,指定一個方法爲JS可以調用的方法,如下圖的openWebview,便是繼承了NativeModule的JAVA端實現類,且可以在js中引入。
Android端例子如下
@ReactMethod
public void openWebview(String url) {
...
}
import {
NativeModules
} from 'react-native';
RN端使用方法是 NativeModules.xxx.openWebview()
注意:上處xxx是指Module 中的 getName()
總結一下:
MainApplication繼承了ReactApplication,返回了ReactNativeHost。
ReactNativeHost裏創建了ReactInstanceManager,並且實現了getPackages,返回了ReactPackage列表。
ReactInstanceManager在創建Builder時,把ReactPackage列表加入到管理器。
ReactPackage列表裏面都關聯了NativeModule的實現類。
NativeModule的實現類可以通過註解,類似@ReactMethod讓原生方法可以被React調用。
粗略流程:
MainApplication -> ReactApplication -> ReactNativeHost -> ReactInstanceManager -> ReactPackage -> NativeModule -> CatalystInstance(這位就是負責發送的同志)
所以只要實現了ReactPackage和NativeModule,將它註冊到ReactNativeHost 或者ReactInstanceManager ,就可以在React Native中繼承你原生的模塊了。
2.ReactNativeHost有什麼用。
3.怎麼用ReactNativeHost
4.總結