Android 如何在hybrid React本机应用程序中传递初始属性
我的Android应用程序是一个混合应用程序,有几个活动是React本机的(RN 0.57.1),其他的则不是(使用androidX) 我的应用程序类声明为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
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);
}