先从android的初始化的文件,ReactNativeHost首先调用createReactInstanceManager()方法,ReactInstanceManagerBuilder这个类里面是什么东西呢

protected ReactNativeHost(Application application) {  mApplication = application;}/** * Get the current {@link ReactInstanceManager} instance, or create one. */public ReactInstanceManager getReactInstanceManager() {  if (mReactInstanceManager == null) {    mReactInstanceManager = createReactInstanceManager();  }  return mReactInstanceManager;}

先看一下点进去第一个就是看到了android的初始化,还有我们的调试Assertions,这个还有下面JSBundleLoader这个是加载类型(从asset文件中去读取

RN的ReactApplication源码分析_第1张图片

JSBundleLoader 我们先重头看起来

RN的ReactApplication源码分析_第2张图片

这个方法getBundleAssetName()开始名称是 "index.android.bundle"

那么我们可以发现到了传入了这个bundle

protected @Nullable String getBundleAssetName() {  return "index.android.bundle";}

在从下面我们可以得知为什么我们一定要把bundle放在assets文件下面了,

不为空,那么开始拼写路径

public static JSBundleLoader createFileLoader(    final String fileName,    final String assetUrl,    final boolean loadSynchronously) {  return new JSBundleLoader() {    @Override    public String loadScript(CatalystInstanceImpl instance) {      instance.loadScriptFromFile(fileName, assetUrl, loadSynchronously);      return fileName;    }  };}

获取到路径了,下面我们继续走,一开始设置我们的名称完之后,后面必然是走入这一步,进行加载我们的loader,我们先放着,先继续看初始化文件

public static JSBundleLoader createFileLoader(    final String fileName,    final String assetUrl,    final boolean loadSynchronously) {  return new JSBundleLoader() {    @Override    public String loadScript(CatalystInstanceImpl instance) {      instance.loadScriptFromFile(fileName, assetUrl, loadSynchronously);      return fileName;    }  };}

RN的ReactApplication源码分析_第3张图片

先看1,里面的mapplication,初始化那么必然从外面获取,我们肯定需要调用的。

2:里面的是获取了,我们的index.android 安卓名称

3:public abstract boolean getUseDeveloperSupport(); 这个是获取开发菜单的,后面再看这个方法

4:这个返回了一个null,但是里面我们的硬件的返回键拦截

5:ui的管理,后面详细介绍

6:生命周期管理,里面看到了BEFORE_CREATE,BEFORE_RESUME,RESUMED,在创建之前,在重新开启前,重新开启

7:添加我们的交互包

8:获取bundle的链接

9:设置我们的file,开始加载我们的bundle

10:和9差不多

然后我们在看看里面的方法

 

 

这个方法是不是可以考录预加载方式,判断是不是有

public boolean hasInstance() {  return mReactInstanceManager != null;}

//这个是物理按键,也可以进行重写

protected @Nullable RedBoxHandler getRedBoxHandler() {  return null;}

//ui的provider的重写也可以。。。。

protected UIImplementationProvider getUIImplementationProvider() {  return new UIImplementationProvider();}

//如果我们不设置,会有默认的模块名称

protected String getJSMainModuleName() {  return "index.android";}

//这个位子是不是可以考虑热更新的加载了

protected @Nullable String getJSBundleFile() {  return null;}

//不喜欢就叫做index.android.bundle,改名去吧~~哈哈

protected @Nullable String getBundleAssetName() {  return "index.android.bundle";}

//获取开发的菜单

public abstract boolean getUseDeveloperSupport();

//添加我们的工具包

protected abstract List getPackages();

在我们的appcation的上面

//在任何库可以加载SoLoader之前,都需要初始化。应用程序使用
SoLoader应该通过调用SoLoader来实现。初始化应用程序初始化路径。电话必须在加载静态初始化器中使用SoLoader之前发生。

protected abstract List getPackages();

里面的第一个是获取ui的模式

protected abstract List getPackages();

还有一些其他的初始化

public static void init(Context context, int flags) throws IOException {  StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();  try {    initImpl(context, flags);  } finally {    StrictMode.setThreadPolicy(oldPolicy);  }}

到此。。。。有兴趣的可以再去看看build里面的东西,还是蛮有意思的


更多相关文章

  1. Android数据库中事务操作方法之银行转账示例
  2. ListView的右边滚动滑块启用方法
  3. 【Android】通过手势切换屏幕的几种方法
  4. android加载文件的方式,路径的写法
  5. Android如何使用读写cookie的方法
  6. 收藏一个 漂亮的 Android加载中动画AVLoadingIndicatorView
  7. android觀察者模式三種實現方法
  8. Android ScrollView嵌套ListView 滑动冲突问题的解决方法

随机推荐

  1. mysql 列转行,合并字段的方法(必看)
  2. mysql列转行以及年月分组实例
  3. mysql 列转行的技巧(分享)
  4. MySQL 按指定字段自定义列表排序的实现
  5. mysql索引使用技巧及注意事项
  6. 老生常谈MYSQL模式匹配 REGEXP和like的用
  7. 浅谈mysql的索引设计原则以及常见索引的
  8. MySQL5绿色版windows下安装总结(推荐)
  9. MySQL中Decimal类型和Float Double的区别
  10. explain分析sql效率的方法