RN安卓实现分析之ReactActivity的前世今生

转载 请注明出处:王亟亟的大牛之路

为什么写着一系列?

最近的工作内容都是RN相关的开发的一些内容,正好有对源码进行一些修改,所以把改的过程中的一些记录化作源码分析介绍给大家

准备怎么介绍?

会直接依序读源码+介绍的方式介绍RN安卓实现的原理(但是会分为多个篇幅,一篇内容太多不容易吸收)

OK,安利完就开始吧
https://github.com/ddwhan0123/Useful-Open-Source-Android (各种库的收纳,长期维护)

写着一片之前,没有看过任何其他兄弟对相关内容的分析,不是觉得自己牛逼。
是怕别人的思维影响到我的理解,如果讲得不对,欢迎指出!


在我们初始化RN项目的时候会有几样标配

  • ReactActivity
  • 继承ReactContextBaseJavaModule的Module
  • 继承ReactPackage的Package

简单的描述下这几个小伙伴

Module是你的各种业务能力,可能是控件,可能是属性,可能是方法,作为Native对于JS模块的能力支持。

Package是你装载这些能力的容器。

ReactActivity是你的页面容器同能力于普通的Activity。


ReactActivity

public abstract class ReactActivity extends Activity
    implements DefaultHardwareBackBtnHandler, PermissionAwareActivity 
  • 抽象类
  • 实现DefaultHardwareBackBtnHandler (用来处理返回键事件)
  • 实现PermissionAwareActivity (用来处理授权相关能力,虽然叫Activity 但是是个接口)

构造函数

 protected ReactActivity() {
    mDelegate = createReactActivityDelegate();
  }

构造函数就一个,创建了自己的代理实现类ReactActivityDelegate,ReactActivityDelegate却很纯粹,是一个实现功能的类,这个后面介绍。

这里写图片描述

创建代理类也不复杂
1 传入当前页面的上下文对象
2 传入一个控件主入口的名称(实现多入口的实现就靠它,像这样)

'use strict'
import { AppRegistry } from 'react-native';
import RootView from './src/view/RootView'
import GoodsView from './src/view/GoodsView'
import OrderView from './src/view/OrderView'

AppRegistry.registerComponent('RootRNActivity', () => RootView);
AppRegistry.registerComponent('GoodsRNActivity', () => GoodsView);
AppRegistry.registerComponent('OrderRNActivity', () => OrderView);

这里写图片描述

然后代理类实现了各个生命周期,有几点注意下

没有onStop()
没有onRestart()
强化了物理键对键盘的影响

这里写图片描述

上图的一些方法就是出去生命周期之外,ReactActivity自身业务的实现

onNewIntent:给JS传递Intent的实现
requestPermissions:Activity提供的授权实现
onRequestPermissionsResult:授权回来后的回调
getReactNativeHost:返回当前代理的ReactNativeHost(这部分后便会介绍,这是实现的核核心类)
getReactInstanceManager:返回当前代理的ReactInstanceManager(同上)
loadApp:实现类驱动Module的方法

RNActivity 就这么看完了,实现其实挺简单的吧。自身其实啥业务实现,就是暴露各种实现的容器。
所以大家要是要自定义RN的基础容器其实继承不继承ReactActivity根本无所谓,根据业务需要即可!


ReactActivityDelegate

这里写图片描述

类变量
mActivity/mFragmentActivity:此二者为上有页面传递的上下文内容,一定只有一个存在
mMainComponentName:组建名,入口级Name全程持有
mReactRootView:UI内容的根试图

构造函数

 public ReactActivityDelegate(
    FragmentActivity fragmentActivity,
    @Nullable String mainComponentName)
public ReactActivityDelegate(Activity activity, @Nullable String mainComponentName)

2个activity只能活一个!!!!!

这里写图片描述

getLaunchOptions:传递给js的属性,props里的内容,可以为空
createRootView:创建一个UI内容的实体类
getReactNativeHost:返回当前上下文的ReactNativeHost(之后详细讲)
getReactInstanceManager:返回ReactNativeHost持有的ReactInstanceManager(之后详细讲)

loadApp才是这是创建页面的核心方法,内部实现的startReactApplication方法传入多个参数

  • ReactNativeHost持有的ReactInstanceManager(之后解释他做啥用)
  • appKey(入口名)
  • getLaunchOptions()(Bundle属性)

onCreate里最后getPlainActivity().setContentView(mReactRootView);,是不是很熟悉?

这里写图片描述

看到这发现,前面的实现都向下传递了,圈圈套圈圈都行为,还得继续!
这一篇是一个开头,详细介绍了下我们的入口页面ReactActivity和他的代理实现类ReactActivityDelegate

画一下ReactActivity的继承树

Created with Raphaël 2.1.2ReactActivityActivityContextThemeWrapperContextWrapperContext

下一篇会继续往下深入读源码,谢谢各位观众姥爷


广告下!!

蔚来汽车
上海-徐汇/安亭 (安亭有班车)
收Android/iOS/Qa/Java/RN/Vue
弹性工作时间,不强制加班
有意向可以扫我微信,注明来意

这里写图片描述

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值