/**

  • Delegate class for {@link ReactActivity} and {@link ReactFragmentActivity}. You can subclass this

  • to provide custom implementations for e.g. {@link #getReactNativeHost()}, if your Application

  • class doesn’t implement {@link ReactApplication}.

*/

public class ReactActivityDelegate {

private final @Nullable Activity mActivity;

private final @Nullable FragmentActivity mFragmentActivity;

private final @Nullable String mMainComponentName;

private @Nullable ReactRootView mReactRootView;

private @Nullable DoubleTapReloadRecognizer mDoubleTapReloadRecognizer;

public ReactActivityDelegate(Activity activity, @Nullable String mainComponentName) {

mActivity = activity;

mMainComponentName = mainComponentName;

mFragmentActivity = null;

}

public ReactActivityDelegate(

FragmentActivity fragmentActivity,

@Nullable String mainComponentName) {

mFragmentActivity = fragmentActivity;

mMainComponentName = mainComponentName;

mActivity = null;

}

protected @Nullable Bundle getLaunchOptions() {

return null;

}

protected ReactRootView createRootView() {

return new ReactRootView(getContext());

}

/**

  • Get the {@link ReactNativeHost} used by this app. By default, assumes

  • {@link Activity#getApplication()} is an instance of {@link ReactApplication} and calls

  • {@link ReactApplication#getReactNativeHost()}. Override this method if your application class

  • does not implement {@code ReactApplication} or you simply have a different mechanism for

  • storing a {@code ReactNativeHost}, e.g. as a static field somewhere.

*/

protected ReactNativeHost getReactNativeHost() {

return ((ReactApplication) getPlainActivity().getApplication()).getReactNativeHost();

}

public ReactInstanceManager getReactInstanceManager() {

return getReactNativeHost().getReactInstanceManager();

}

protected void onCreate(Bundle savedInstanceState) {

if (mMainComponentName != null) {

loadApp(mMainComponentName);

}

mDoubleTapReloadRecognizer = new DoubleTapReloadRecognizer();

}

protected void loadApp(String appKey) {

if (mReactRootView != null) {

throw new IllegalStateException(“Cannot loadApp while app is already running.”);

}

mReactRootView = createRootView();

mReactRootView.startReactApplication(

getReactNativeHost().getReactInstanceManager(),

appKey,

getLaunchOptions());

getPlainActivity().setContentView(mReactRootView);

}

… 中间省略生命周期、返回事件、权限请求的方法

private Context getContext() {

if (mActivity != null) {

return mActivity;

}

return Assertions.assertNotNull(mFragmentActivity);

}

private Activity getPlainActivity() {

return ((Activity) getContext());

}

}

ReactActivityDelegate 类中主要完成这几件事:

  • (1)定义 getReactNativeHost、getReactInstanceManager 方法,获取对应实例。可以看到此处调用的是MainApplication中定义的ReactNativeHost实例。这里也就明白,为什么MainApplication需要实现ReactApplication接口,并重写 getReactNativeHost方法了。如果不实现 ReactApplication,可以把ReactNativeHost定义成全局静态常量即可。

  • (2)定义生命周期方法、返回事件方法、权限请求方法。并在方法中调用 ReactInstanceManager 中对应的方法。

  • (3)定义 createRootView 方法,在该方法中,通过 new ReactRootView,创建 ReactRootView 实例。

  • (4)在 onCreate 生命周期中,判断 mMainComponentName,如果不为 null,则执行 loadApp 方法。所以我们重点来看 loadApp 方法。

  • (5)在 loadApp 方法中主要做了三件事:

  1. 创建 RootView

  2. 调用 RootView 实例的 startReactApplication 方法,将 ReactInstanceManager 实例、appKey、启动时初始化参数作为参数传递过去

  3. 将 ReactRootView 设置为 MainActivity 布局视图

从 ReactActivityDelegate 方法中,我们了解到很多方法都交给了 ReactInstanceManager 实例去处理,ReactInstanceManager实例是通过 MainApplication 类中初始化的 ReactNativeHost 实例获取,在分析 ReactInstanceManager 之前,先跟进 ReactNativeHost 源码看一看:

ReactNativeHost

package com.facebook.react;

/**

  • 包含 ReactInstanceManager 实例的简单类, 在 MainApplication 中定义 或 定义成静态字段使用。

*/

public abstract class ReactNativeHost {

private final Application mApplication;

private @Nullable ReactInstanceManager mReactInstanceManager;

protected ReactNativeHost(Application application) {

mApplication = application;

}

/**

  • 获取 或 创建 ReactInstanceManager 实例

*/

public ReactInstanceManager getReactInstanceManager() {

if (mReactInstanceManager == null) {

mReactInstanceManager = createReactInstanceManager();

}

return mReactInstanceManager;

}

/**

  • 获取此持有者是否包含{@link ReactInstanceManager}实例

*/

public boolean hasInstance() {

return mReactInstanceManager != null;

}

/**

  • 销毁当前实例并释放对其的内部引用,允许它进行GCed

*/

public void clear() {

if (mReactInstanceManager != null) {

mReactInstanceManager.destroy();

mReactInstanceManager = null;

}

}

/**

  • 创建 ReactInstanceManager 实例

*/

protected ReactInstanceManager createReactInstanceManager() {

ReactInstanceManagerBuilder builder = ReactInstanceManager.builder()

.setApplication(mApplication)

.setJSMainModulePath(getJSMainModuleName())

.setUseDeveloperSupport(getUseDeveloperSupport())

.setRedBoxHandler(getRedBoxHandler())

.setJavaScriptExecutorFactory(getJavaScriptExecutorFactory())

.setJSIModulesPackage(getJSIModulePackage())

.setInitialLifecycleState(LifecycleState.BEFORE_CREATE);

for (ReactPackage reactPackage : getPackages()) {

builder.addPackage(reactPackage);

}

String jsBundleFile = getJSBundleFile();

if (jsBundleFile != null) {

builder.setJSBundleFile(jsBundleFile);

} else {

builder.setBundleAssetName(Assertions.assertNotNull(getBundleAssetName()));

}

ReactInstanceManager reactInstanceManager = builder.build();

return reactInstanceManager;

}

protected final Application getApplication() {

return mApplication;

}

protected @Nullable

JSIModulePackage getJSIModulePackage() {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后看一下《Android框架体系架构(高级UI+FrameWork源码)》学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

19pSL4-1710676504855)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-SPj4QXEx-1710676504856)]

最后看一下《Android框架体系架构(高级UI+FrameWork源码)》学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

[外链图片转存中…(img-DM51PWZa-1710676504856)]

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐