内容简介:开篇之前日常安利上一篇提到了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代码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
CSS禅意花园
[美] Dave Shea、Molly E. Holzschlag / 陈黎夫、山崺颋 / 人民邮电出版社 / 2007-6 / 49.00元
这本书的作者是世界著名的网站设计师,书中的范例来自网站设计领域最著名的网站——CSS Zen Garden(CSS禅意花园)。全书分为两个主要部分。第1章为第一部分,讨论网站“CSS禅意花同”及其最基本的主题,包含正确的标记结构和灵活性规划等。第二部分包括6章,占据了书中的大部分篇幅。 每章剖析“CSS禅意花园”收录的6件设计作品,这些作品围绕一个主要的设计概念展开,如文字的使用等。通过探索......一起来看看 《CSS禅意花园》 这本书的介绍吧!