gpt4 book ai didi

android - React-Native Android ReactContext 返回 null

转载 作者:太空狗 更新时间:2023-10-29 13:15:35 25 4
gpt4 key购买 nike

由于 React-Native AppState API 仅适用于 iOS,因此我正在为我的应用程序的 Android 端编写一个 appState 事件发射器。在 Java 端的应用程序 MainActivity 中,我想从 onResumeonPause 函数发出,以通过桥接器告诉 JS 端我的应用在前台后台

目前,我可以最小化我的应用程序(并返回到我设备上的主屏幕)并且 background 事件会正确发出。但是,当我恢复我的应用程序时,没有任何东西被解雇......当应用程序最初打开时也没有任何东西被解雇。

我已经将范围缩小到这样一个事实,即在这些情况下 mReactInstanceManager.getCurrentReactContext() 为空...出于某种原因。

这是我在 MainActivity.java 中的代码:

@Override
protected void onPause() {
super.onPause();

if (mReactInstanceManager != null) {
mReactInstanceManager.onPause();

//send the appState back to JS
Log.d("REACT_STATE", "Paused"); //this always fires
if(mReactInstanceManager.getCurrentReactContext()!=null) {
WritableMap params = Arguments.createMap();
params.putString("currentAppState", "background");
sendEvent(mReactInstanceManager.getCurrentReactContext(), "appStateChange", params);
}
}
}

和,

@Override
protected void onResume() {
super.onResume();

if (mReactInstanceManager != null) {
mReactInstanceManager.onResume(this, this);

//send the appState back to JS
Log.d("REACT_STATE", "Resumed"); //this also always fires
if(mReactInstanceManager.getCurrentReactContext()!=null) {
WritableMap params = Arguments.createMap();
params.putString("currentAppState", "foreground");
sendEvent(mReactInstanceManager.getCurrentReactContext(), "appStateChange", params);
}
}
}

这是发射器代码:

private void sendEvent(ReactContext reactContext,
String eventName,
@Nullable WritableMap params) {
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}

JS 方面的设置正常并且可以正常工作 - 如果有帮助,我可以提供此代码。我相当确定我的问题出在这一边。我是不是想在错误的时间发出这个?我需要把它移到别处吗?非常感谢任何建议!

最佳答案

好的,我已经设法解决了这个问题。我创建了一个新的插件包 AppStateAndroid,它返回给 JS。这是在应用程序生命周期的正确时间添加的,并且可以完美运行。我打算将代码发布到 GitHub ( http://github.com/scgough ),但对于任何想知道的人,请看这里:

public class AppStateAndroidPlugin extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks {

private static final String PLUGIN_NAME = "AppStateAndroid";

private ReactContext mReactContext;

protected Activity activity = null;

protected Activity getActivity(){
return this.activity;
}

public AppStateAndroidPlugin(ReactApplicationContext reactContext, Activity activity) {
super(reactContext);

this.mReactContext = reactContext;

this.activity = activity;
this.activity.getApplication().registerActivityLifecycleCallbacks(this);
}

private void sendEvent(ReactContext reactContext,
String eventName,
@Nullable WritableMap params) {

Log.d(PLUGIN_NAME, "Sending Event"+params.toString());
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}
...
@Override
public void onActivityResumed(Activity activity) {
Log.d(PLUGIN_NAME, "Resumed");
if(mReactContext!=null) {
WritableMap params = Arguments.createMap();
params.putString("currentAppState", "active");
sendEvent(mReactContext, "appStateChange", params);
}
}

@Override
public void onActivityPaused(Activity activity) {
Log.d(PLUGIN_NAME, "Paused");
if(mReactContext!=null) {
WritableMap params = Arguments.createMap();
params.putString("currentAppState", "background");
sendEvent(mReactContext, "appStateChange", params);
}
}
...
@Override
public void onActivityDestroyed(Activity activity) {
Activity myActivity = this.getActivity();
if (activity == myActivity){
myActivity.getApplication().unregisterActivityLifecycleCallbacks(this);
}
}

@Override
public String getName() {
return PLUGIN_NAME;
}
}

然后在您的主要 Activity 中您需要一个包文件:

mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.addPackage(new AppStateAndroidPluginPackage(this))
...

关于android - React-Native Android ReactContext 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041962/

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