文化袁探索专栏——React Native启动流程

文化袁探索专栏——Activity、Window和View三者间关系
文化袁探索专栏——View三大流程#Measure
文化袁探索专栏——View三大流程#Layout
文化袁探索专栏——消息分发机制
文化袁探索专栏——事件分发机制
文化袁探索专栏——Launcher进程启动流程’VS’APP进程启动流程
文化袁探索专栏——Activity启动流程
文化袁探索专栏——自定义View实现细节
文化袁探索专栏——线程安全
文化袁探索专栏——React Native启动流程

ReactNative启动流程|Android如何向RN传递初始参数props

$ npx react-native run-android执行启动RN项目,其应用中只有一个Activity[MainActivity],继承自RN框架的ReactActivity【是RN开发页面的容器】。

在这里插入图片描述

进入MainActivity页面执行Activity生命周期onCreate、onPause、onResume、onDestory。而这些生命周期方法都被类ReactActivityDelegate中对应方法所代理。

进入生命周期方法MainActivity$onCreate,即执行到ReactActivityDelegate$onCreate时,调用方法ReactActivityDelegate$loadApp。之后将loadApp交由ReactDelegate执行,并创建RootView(RN活动页视图),并通过方法startReactApplication启动了整个页面。

在RootView$startReactApplication方法中执行mReactInstanceManager.createReactContextInBackground()异步创建活动页上下文ReactContext,然后加载、执行,并将JavaScript映射成Native Widget。直至最后RN页面形成并展示出来 。

/// ReactActivityDelegate.java [Android API 30]
protected void onCreate(Bundle savedInstanceState) {
   ...
    if (mMainComponentName != null) {
      loadApp(mainComponentName); // 代理ReactActivity执行到关键方法
    }
  }
/// ReactActivityDelegate.java [Android API 30]
protected void loadApp(String appKey) {
    mReactDelegate.loadApp(appKey); // 将RN启动关键流程交给ReactDelegate.loadApp
    getPlainActivity().setContentView(mReactDelegate.getReactRootView());
  }
/// ReactDelegate.java [Android API 30]
public void loadApp(String appKey) {
    if (mReactRootView != null) {
      throw new IllegalStateException("Cannot loadApp while app is already running.");
    }
    mReactRootView = createRootView();//创建活动页的视图GroupView(JavaScriptUI的容器)
    // 执行RN启动流程第二个关键方法startReactApplication。也是正式进入RN启动的方法。
    mReactRootView.startReactApplication(
        getReactNativeHost().getReactInstanceManager(), appKey, mLaunchOptions);
  }
/// RootView.java [Android API 30]
/**
   * Schedule rendering of the react component rendered by the JS application from the given JS
   * 调度由JS应用程序从给定JS中呈现react组件
   */
  @ThreadConfined(UI)
  public void startReactApplication(
     ...
      mReactInstanceManager = reactInstanceManager;
      mJSModuleName = moduleName;
      mAppProperties = initialProperties;
      mInitialUITemplate = initialUITemplate;
	// 创建上下文
      mReactInstanceManager.createReactContextInBackground();

   ...
  }

Android如何向RN传递初始参数props
在这里插入图片描述
需求描述:
从原生Android转入ReactNative的第一个React.Component,在该Component中可以通过this.props获取到原生安卓传递的参数对象。该如何实现?通过startReactApplication重载方法中第三个参数Bundle来实现。在RN中可以获取到由原生传入的该Bundle对象。

// 例如~~
val rnBundle = Bundle()
rnBundle.putCharSequence("device-info","设备信息对象")
rnBundle.putCharSequence("state","用户登录状态")
mReactRootView?.startReactApplication(mReactInstanceManager, "ICRNBridge",rnBundle)

在对应的ReactNative的Coponent中获取,则可通过this.props得到!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值