Android 如何在hybrid React本机应用程序中传递初始属性

Android 如何在hybrid React本机应用程序中传递初始属性,android,react-native,Android,React Native,我的Android应用程序是一个混合应用程序,有几个活动是React本机的(RN 0.57.1),其他的则不是(使用androidX) 我的应用程序类声明为 class MyApplication: extends Application { ... } 我跟随本文将初始属性传递给react native JS端 这篇文章和我找到的其他方法都建议在你的活动中引入ReactActivityDelegate。 并在那里设置初始属性 这需要从ReactActivity派生特定的activity

我的Android应用程序是一个混合应用程序,有几个活动是React本机的(RN 0.57.1),其他的则不是(使用androidX)

我的应用程序类声明为

class MyApplication: extends Application  {
...

}
我跟随本文将初始属性传递给react native JS端

这篇文章和我找到的其他方法都建议在你的活动中引入ReactActivityDelegate。 并在那里设置初始属性

这需要从ReactActivity派生特定的activity,这就是我所做的:

    public class ReactNative1Activity extends ReactActivity implements DefaultHardwareBackBtnHandler {

    /* previously inherited from
androidx.appcompat.app.AppCompatActivity */

    ...
    }
但是,ReactActivityDelegate希望我的整个应用程序都是ReactApplication,而不仅仅是一个特定的活动

从它使用的类型强制转换中可以明显看出这一点

  /**
   * 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();
  }
通过这些使用委托的更改,我开始出现运行时错误

3:08:51.706 9817-9817/com.mytestapp.develope E/AndroidRuntime:FATAL 例外情况:主要 进程:com.mytestapp.develope,PID:9817 java.lang.RuntimeException:无法恢复活动{com.mytestapp.develope/com.mytestapp.ReactNative1Activity}: java.lang.ClassCastException:com.mytestapp.MyApplication不能为 转换到com.facebook.react.react应用程序 位于android.app.ActivityThread.performResumeActivity(ActivityThread.java:3581) 在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621)上 位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862) 位于android.app.ActivityThread.-wrap11(未知来源:0) 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)上 位于android.os.Handler.dispatchMessage(Handler.java:106) 位于android.os.Looper.loop(Looper.java:164) 位于android.app.ActivityThread.main(ActivityThread.java:6494) 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 原因:java.lang.ClassCastException:com.mytestapp.MyApplication无法强制转换为 com.facebook.react.react应用程序 位于com.facebook.react.ReactActivityDelegate.getReactNativeHost(ReactActivityDelegate.java:71) 在com.facebook.react.ReactActivityDelegate.onResume上(ReactActivityDelegate.java:104) 在com.facebook.react.ReactActivity.onResume上(ReactActivity.java:64) 在com.mytestapp.ReactNative1Activity.onResume上(ReactNative1Activity.java:219) 位于android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1355) 在android.app.Activity.performResume上(Activity.java:7117) 位于android.app.ActivityThread.performResumeActivity(ActivityThread.java:3556) 在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621)上 位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862) 位于android.app.ActivityThread.-wrap11(未知来源:0) 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)上 位于android.os.Handler.dispatchMessage(Handler.java:106) 位于android.os.Looper.loop(Looper.java:164) 位于android.app.ActivityThread.main(ActivityThread.java:6494) 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我不认为,我希望我的整个应用程序继承自android.app.application以外的其他应用程序

有可能让它工作吗?

找到了答案。 无需使用ReactActivityDelegate将initialProperties创建到自定义组件中

因此,无需使我的活动继承自ReactActivity,也无需让我的应用程序实现ReactApplication接口

相反,集成React的每个现有AndRoid应用程序都需要重写特定活动的onCreate并创建ReactRootView (我已经在做了)

依照

ReactRootView.startApplication

作为最后一个参数,接受他们所称的initialProperties

这恰好与ReactAcityDelegate的自定义(重写)getLaunchOption返回的包相同

因此,将具有您自己的自定义属性的捆绑包传递到ReactRootView.StartreatApplication中——是有效的

@Override
protected onCreate ( ... )
{
....

        Bundle initialProperties=getMyOwnLaunchOptions(mydata1,,myData2);
        mReactRootView.startReactApplication(mReactInstanceManager,
                 "MyRNAppExample",
                initialProperties);
        setContentView(mReactRootView);


}