1. 程式人生 > >React Native安卓實現分析之ReactInstanceManager的包裝類ReactNativeHost

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開發
標準五險一金(不避稅)
不強制加班,彈性工作

有意向的可以加我微信,必須註明來意
在這裡插入圖片描述