React Native安卓實現分析之ReactInstanceManager的包裝類ReactNativeHost

轉載請註明出處:王亟亟的大牛之路

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

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

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