ReactNativeHost介紹

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.總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章