2016-01-27 91 views
2

由于React-Native AppState API仅适用于iOS,因此我正在为应用程序的Android端编写appState事件发射器。在应用程序的MainActivity在Java端,我想从onResume和功能发出告诉JS侧过我的应用程序或者是在前景背景React-Native Android ReactContext返回null

此刻,我的桥梁可以最小化我的应用程序(并返回到我的设备上的主屏幕),并正确发射事件。但是,当我恢复我的应用程序没有被解雇......也没有什么是当应用程序最初打开时被解雇。

我缩小了这一点,因为在这些情况下,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); 
     } 
    } 
} 

,并

,这是发射器代码:

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

事物的JS侧设置OK和工作 - 如果有帮助,我可以提供此代码。我很确定我的问题在于此。我是否试图在错误的时间发出这个消息?我需要将它移动到其他地方吗?任何意见非常感谢!

回答

1

好吧,我设法对此进行排序。我创建了一个新的插件包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; 
} 
} 

你需要为这个一揽子文件,然后在您的主要活动:

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

辉煌的例子..非常感谢。 –

+0

@Srikanth谢谢。很高兴你喜欢。请投票等! :-) – scgough

+0

我upvoted它..我有一个问题,如果你可以帮助我..我有一个菜单按钮和onclick()我需要发送事件 –

-1

对于任何想办法得到活动的ReactContext例如,使用

this.getReactNativeHost().getReactInstanceManager().getCurrentReactContext(); 

,而不是

this.getReactInstanceManager().getCurrentReactContext(); 

虽然我不明白为什么...

+0

这并没有提供问题的答案。一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你将能够[评论任何职位](http://stackoverflow.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/15281833) – anticafe

+0

@anticafe我相信这正是问题的答案。问题中的问题是无法从活动中获取ReactContext实例。这解决了它。 – user2718861