预加载的方案和原理网上其实也有非常多。我先简单的贴一下代码
Delegate
需要两个新增的类: 一个是继承 ReactActivityDelegate
用于承载 Rn 的 activity 重写 createReactActivityDelegate
方法
|
|
某些小 app 可能就一个 activity ,所以启动页可以使用 windowBackground 替代。而目前大部分 app 的 hybrid 开发的,前面的页面基本都是 native, 这样就会导致打开后,第一时间看到的并不是 windowBackground,而是空白的 activity,所以这个时候需要先人为添加一个 contentView,然后再加载完 reactRootView 后,add 到 我们的 contentView 的节点中。
CacheViewManager
|
|
这边使用了 MutableContextWrapper
,是因为 rn 加载的 activity 和 预加载的 activity 不是同一个 activity,这样会导致 js 中的 modal ,也就是 android 中的 dialog,会提示 activity 已销毁,无法弹出。所以在 init 的时候,是使用 MutableContextWrapper
,而在 getRootView 的时候,再重新 setBaseContext ,把真正的容器 activity 设置进去。这样就能保证 dialog 弹出的 是在当前的 activity。
使用
在前置 activity 中:
|
|
在 reactActivity 中:
|
|
使用自定义的 delegate 就好了。
总结
这样做可以灵活的显示 reactRootView 未加载完之前要显示的界面。效果也挺明显的,但是我比较懒,就不贴图啦。