gpt4 book ai didi

android - React Native - 如何从 MainActivity.java 向 RN 发出事件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:24:51 30 4
gpt4 key购买 nike

在 React Native AppState 库中:
iOS有三种状态background->inactive->active
Android 只有 background->active

当 Android 应用程序完全后台运行时,MainActivity 从 onPause -> onStop

当有系统通知时,例如应用内购买会转到 onPause

当应用程序从后台转到前台时,我需要运行一些代码
onStop -> onResume

如果应用程序因系统通知而短暂暂停,我不希望它运行
onPause -> onResume

这可能吗? React 的生命周期事件没有 onHostStop

我尝试从 MainActivity 为每个 Activity 生命周期事件发出一个事件,但这导致应用程序因空指针异常而崩溃。

是否有可能从 MainActivity 向 React Native 发出事件?

谢谢

编辑 添加代码以显示尝试从 MainActivity 发出事件

MainActivity.java fragment

import com.facebook.react.ReactActivity;
import com.facebook.react.modules.core.DeviceEventManagerModule;

public class MainActivity extends ReactActivity {

DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter;

@Override
public void onStop() {
super.onStop();
eventEmitter.emit("onStop", "ActivityonStop");
}
}

react native

const nativeEventListener = DeviceEventEmitter.addListener('onStop',
(e)=>{
console.log("NATIVE_EVENT");
dispatch({type: "NATIVE_EVENT"})
})

logcat 错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.realer.android, PID: 15251
java.lang.RuntimeException: Unable to stop activity {com.realer.android/com.realer.android.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.facebook.react.modules.core.DeviceEventManagerModule$RCTDeviceEventEmitter.emit(java.lang.String, java.lang.Object)' on a null object reference
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3837)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3886)
at android.app.ActivityThread.-wrap25(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.facebook.react.modules.core.DeviceEventManagerModule$RCTDeviceEventEmitter.emit(java.lang.String, java.lang.Object)' on a null object reference
at com.realer.android.MainActivity.onStop(MainActivity.java:40)
at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1289)
at android.app.Activity.performStop(Activity.java:6839)
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3834)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3886) 
at android.app.ActivityThread.-wrap25(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method)

最佳答案

尝试像这样更新您的 MainActivity.java:

public class MainActivity extends ReactActivity {

@Override
public void onStop() {
super.onStop();

WritableMap params = Arguments.createMap(); // add here the data you want to send
params.putString("event", "ActivityonStop"); // <- example

getReactInstanceManager().getCurrentReactContext()
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("onStop", params);
}
}

让我知道这是否有效。在我的应用程序中,我通常从扩展 ReactContextBaseJavaModule 的类发送事件,在该类中我可以通过调用 getReactApplicationContext() 访问上下文,但它似乎可以工作,如果你可以从ReactInstanceManager获取ReactContext

关于android - React Native - 如何从 MainActivity.java 向 RN 发出事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40898625/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com