文化袁探索专栏——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得到!