gpt4 book ai didi

java - 如何将事件从 MainActivity onCreate 发送到 React Native?

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:31 24 4
gpt4 key购买 nike

我正在开发一个闹钟,但我不知道如何从 MainActivity 向 React Native 发送事件。这是我到目前为止所做的:

    @Override
protected void onCreate(Bundle savedInstanceState) {
mInitialProps = new Bundle();
final Bundle bundle = mActivity.getIntent().getExtras();
ReactInstanceManager mReactInstanceManager = getReactNativeHost().getReactInstanceManager();
ReactApplicationContext context = (ReactApplicationContext) mReactInstanceManager.getCurrentReactContext();
if (context == null) {
mReactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
public void onReactContextInitialized(ReactContext context) {
if (bundle != null && bundle.containsKey("sendAlarm")) {
if (bundle.getString("sendAlarm").equals("sendAlarmOn")) {
LauncherModule.startAlarm(mActivity); // works
LauncherModule.sendAlarmEvent(); // doesn't work. Should run after alarm manager starts app which previously had been killed
}
}
}
});
} else {
if (bundle != null && bundle.containsKey("sendAlarm")) {
if (bundle.getString("sendAlarm").equals("sendAlarmOn")) {
LauncherModule.startAlarm(mActivity); // works
LauncherModule.sendAlarmEvent(); // works and sends event only when app was left open
}
}
}
super.onCreate(savedInstanceState);
}

仅当应用程序保持打开状态并且警报管理器重新启动应用程序本身时,该代码才有效。如果我关闭应用程序并且警报管理器启动它,那么似乎只有 startAlarm 函数(它有声音效果)被触发..

无论我做什么,无论我将 sendEvent 函数放在 Mainactivity 还是其他地方(例如外部模块),如果我关闭应用程序,它都不会发送事件。我还尝试将 getReactInstanceManager().getCurrentReactContext() 与此问题 Send data from Android activity to React Native 中的 while 结合使用。无济于事。

还尝试创建 boolean beeing 设置为 true onCreate,然后发送事件 onStart 或 onRestart。也无济于事。

有什么建议吗?

编辑:sendEvent 函数如下所示:

public final void sendEvent(String eventName, boolean isAlarmOn) {  
getReactInstanceManager().getCurrentReactContext()
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, isAlarmOn);
}

最佳答案

解决方案

嗯,我认为答案是不要使用 onCreate 的 sendEvent 方法,因为(我可能是错的)监听器似乎是在事件发送后初始化的。所以没有什么会监听这个事件。

它似乎在 onStart、onRestart、onPause 中工作得很好。

我们能做什么? React Native 提供 ReactActivityDelegate与初始 Prop 。它完成了工作!

ReactActivityDelegateMainActivity应如下所示:

public class ActivityDelegate extends ReactActivityDelegate {
private Bundle mInitialProps = null;
private final @Nullable Activity mActivity;

public ActivityDelegate(Activity activity, String mainComponentName) {
super(activity, mainComponentName);
this.mActivity = activity;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
mInitialProps = new Bundle();
final Bundle bundle = mActivity.getIntent().getExtras();
if (bundle != null && bundle.containsKey("sendAlarm")) {
if (bundle.getString("sendAlarm").equals("sendAlarmOn")) {
mInitialProps.putBoolean("alarmOn", true);
}
}
super.onCreate(savedInstanceState);
}

@Override
protected Bundle getLaunchOptions() {
return mInitialProps;
}
};

@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new ActivityDelegate(this, getMainComponentName());
}

然后在您的主应用程序组件(通常是index.android.js)中调用您的 propTypes 并使用它们来运行您的代码:

static propTypes = {
alarmOn: PropTypes.boolean
}

componentDidMount() {
if (this.props.alarmOn === true) {
// your code
}
}

瞧!

您可以在这里找到完整的示例:https://github.com/vasyl91/react-native-android-alarms

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

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