内容简介:开篇之前日常安利上一篇提到了UI容器类ReactRootView,这一次继续我们的分析之路
转载请注明出处:王亟亟的大牛之路
开篇之前日常安利
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开发
标准五险一金(不避税)
不强制加班,弹性工作
有意向的可以加我微信,必须注明来意
以上所述就是小编给大家介绍的《React Native安卓实现分析之ReactInstanceManager的包装类ReactNativeHost》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- JavaSE基础:包装类
- 一分钟理解 Java 包装类型
- 包装常见的python命名空间
- css – 浮动流体图像留下文本包装
- 14.java 基本数据类型的包装类
- 前端开发如何包装可重用的JavaScript代码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
锦绣蓝图
[美] 沃德科 (Christina Wodtke)、[美] 戈夫拉 (Austin Govella) / 蔡芳 / 人民邮电出版社 / 2009-11-01 / 59.00
Web 2.0和社会化大趋势下,你的网站发展喜人,但是问题也接踵而来:信息变得越来越庞杂无序,业务流程愈加复杂,搜索和导航越来越难,用户对使用体验的要求也越来越高……怎么办? 作者非常通俗易懂地讲述了如何规划易用的网站及其背后的信息架构原理。首先介绍了建立信息架构的八项基本原则,然后重点强调了组织系统和元数据在信息架构中的作用,并指出设计搜索和导航需要考虑的问题和方法,另外还补充了当今热门的......一起来看看 《锦绣蓝图》 这本书的介绍吧!