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的名字),超时时间,是否允许前台运行。

results matching ""

    No results matching ""