AppRegitry
首先会通过Bridge,注入AppRegistry模块
BatchedBridge.registerCallableModule('AppRegistry', AppRegistry);
RCTRootView在init的时候会调用AppRegistry的runApplication函数
unmountApplicationComponentAtRootTag函数,这是native 在RCTRootContentView invalidate时候调用,
registerComponent
函数定义
export type ComponentProvider = () => React$ComponentType<any>;
registerComponent(
appKey: string,
componentProvider: ComponentProvider,
section?: boolean,
): string
Runnable的定义
export type Runnable = {
component?: ComponentProvider,
run: Function,
...
};
runnable可以通过registerComponent/registerRunnabl两个函数注册进入runnables
registerComponent 有三个参数 appKey,componentProvider,section(bool)
在RN App的index.js 需要调用registerComponent
import {AppRegistry} from 'react-native';
import App from './App';
import {name as appName} from './app.json';
AppRegistry.registerComponent(appName, () => App);
appName需要和客户端传入的module name 保持一致,这是作为AppRegistry的appKey
run函数的实现是调用renderApplication函数
runApplication
参数
- appKey,客户端通过RCTRootView初始化传入的module name
- appParameters
- rootTag,RCTRootContentView的tag
- initialProps,RCTRootView初始化传入的启动参数
- displayMode
runApplication主要是
runnables[appKey].run(appParameters, displayMode)
runApplication是由native调用的方法,在RCTRootView init的时候会调用,传入moduleName(即appKey),和appParameters,appParameters包含rootTag和initialProps字段,initialProps为RCTRootView init时的参数initialProperties
renderApplication
- 创建renderable对象
- 然后执行render函数,require('../Renderer/shims/ReactNative').render(renderable, rootTag);
在render函数前后,PerformanceLogger会记录时间到renderApplication_React_render key里面。
renderable对象
<AppContainer
rootTag={rootTag}
fabric={fabric}
showArchitectureIndicator={showArchitectureIndicator}
WrapperComponent={WrapperComponent}
initialProps={initialProps ?? Object.freeze({})}
internal_excludeLogBox={isLogBox}>
<RootComponent {...initialProps} rootTag={rootTag} />
</AppContainer>
AppContainer是最外层的Component
ReactNativeRenderer
参数React.Component,containerTag
- 根据rootTag创建root 结点
- 调用updateContainer,这里会调用传入App.js进行render
Headless JS
Headless JS后台任务是一种在JS后台执行任务的方法,可以用来在后台同步数据、处理推送通知或者播放音乐。目前仅支持Android
import {AppRegistry} from 'react-native';
AppRegistry.registerHeadlessTask('SomeTaskName', () =>
require('SomeTaskName'),
);
module.exports = async taskData => {
// 要做的任务
};
JS API
- registerHeadlessTask,注册一个headless任务,这个任务不能包括UI,调用registerCancellableHeadlessTask方法,保存在taskProviders map内
- startHeadlessTask,执行headless任务,这个函数由Android唤起
Android端
通过HeadlessJsTaskConfig配置任务名(同registerHeadlessTask的名字),超时时间,是否允许前台运行。