我的Android应用程序是一个混合程序,一些活动是React Native(RN 0.57.1),而其他活动则不是(使用androidX)
我的应用程序类声明为
class MyApplication: extends Application {
...
}
我正在关注本文,以将初始属性传递给react-native JS端
https://dev.to/ryohlan/how-to-pass-initial-props-from-android-native-2k2
本文以及我发现的所有其他方法都建议将 ReactActivityDelegate 引入到Activity中。 并在那里设置初始属性。
那需要从ReactActivity派生特定的活动,这就是我所做的:
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.develop E / AndroidRuntime:FATAL 例外:主要 流程:com.mytestapp.develop,PID:9817 java.lang.RuntimeException:无法恢复活动{com.mytestapp.develop / com.mytestapp.ReactNative1Activity}: java.lang.ClassCastException:com.mytestapp.MyApplication不能为 转换为com.facebook.react.ReactApplication 在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.ReactApplication 在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之外的其他东西。
有可能使其正常工作吗?
答案 0 :(得分:1)
弄清楚了。 无需使用ReactActivityDelegate即可将initialProperties创建到自定义组件中。
因此,无需使我的Activity继承自ReactActivity,因此,无需让我的应用实现ReactApplication接口。
相反,每个集成React的现有Andorid应用程序都需要覆盖特定活动的onCreate并创建ReactRootView (我已经在做)。
按照 https://facebook.github.io/react-native/docs/integration-with-existing-apps
ReactRootView.startApplication
作为最后一个参数,采用了他们所谓的initialProperties
与Bundle的 恰好是相同的,它会由ReactAcitityDelegate的自定义(重写)getLaunchOption返回
因此,将具有您自己的自定义属性的Bundle传递到ReactRootView.startReactApplication中-起作用。
@Override
protected onCreate ( ... )
{
....
Bundle initialProperties=getMyOwnLaunchOptions(mydata1,,myData2);
mReactRootView.startReactApplication(mReactInstanceManager,
"MyRNAppExample",
initialProperties);
setContentView(mReactRootView);
}