2016-11-03 29 views
6

ユーザーがアプリケーションを離れる直前(ユーザーがマルチタスク表示になっているか、他のアプリに切り替わっている)の直前にUIを変更しようとしています。具体的には、ユーザーがアプリを離れるときに、アプリのロゴを含む全画面表示を追加したいと考えています。ネイティブAppStateに反応しません。

私はそれにAppStateを使用しています。

iOS上では、期待通りに動作します:マルチタスクビューのアプリは非アクティブ状態になり、他のアプリ状態に切り替えると背景に移動します。状態がアクティブでない場合、私はまだUIを変更することができます。

ただし、Androidでは状態はアクティブまたはバックグラウンドです。 バックグラウンド状態でUIをもう変更できないという問題があります。

これはAndroidでのバグですか?そうでない場合は、Androidで動作させるための選択肢は何ですか?

ありがとうございました。

+1

これはバグではありません。 AndroidのAppStateコンポーネントの実装には、「アクティブ」と「バックグラウンド」状態のみがあります。好奇心が強い、なぜユーザーがアプリを出ようとしているときにアプリロゴのフルスクリーン表示をしたいのですか? – Jickson

+1

マルチタスクビューで機密データが表示されないように表示します。 私はネイティブのものに掘り下げる必要があると思います。 – algizmo

答えて

5

あなたは、あなたがそのライフサイクルイベント

//onResume = 'active' 
//onPause = 'inactive' 
//onStop = 'background' 

@Override 
public void onResume() { 
    super.onResume(); 
    ReactContext reactContext = getReactInstanceManager().getCurrentReactContext(); 
    WritableMap params = Arguments.createMap(); 
    params.putString("event", "active"); 

    // when app starts reactContext will be null initially until bridge between Native and React Native is established 
    if(reactContext != null) { 
     getReactInstanceManager().getCurrentReactContext() 
      .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) 
      .emit("ActivityStateChange", params); 
    } 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    ReactContext reactContext = getReactInstanceManager().getCurrentReactContext(); 
    WritableMap params = Arguments.createMap(); 
    params.putString("event", "inactive"); 

    if(reactContext != null) { 
     getReactInstanceManager().getCurrentReactContext() 
       .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) 
       .emit("ActivityStateChange", params); 
    } 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    ReactContext reactContext = getReactInstanceManager().getCurrentReactContext(); 
    WritableMap params = Arguments.createMap(); 
    params.putString("event", "background"); 

    if(reactContext != null) { 
     getReactInstanceManager().getCurrentReactContext() 
       .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) 
       .emit("ActivityStateChange", params); 
    } 
} 

に耳を傾けるMainActivity.javaにいくつかのコードを追加することによって、iOSのと同じ状態をシミュレートすることができますする必要がある場合はその後、あなたのJSにDeviceEventEmitter

を使用して、これらのライフサイクルの変化に耳を傾けます
const nativeEventListener = DeviceEventEmitter.addListener('ActivityStateChange', 
    (e)=>{ 
     console.log(e.event); 
}) 
+0

私はこれに何の違いも見られず、ネイティブの実装に反応します。フラグメントを考慮しないhttps://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java – evanjmg

関連する問題