【问题标题】:react native AppState has no 'inactive' state on Androidreact native AppState 在 Android 上没有“非活动”状态
【发布时间】:2016-11-03 15:31:57
【问题描述】:

我试图在用户离开应用程序之前更改 UI(用户处于多任务视图或切换到其他应用程序)。更具体地说,当用户离开应用程序时,我想添加一个带有应用程序徽标的全屏视图。

我为此使用 AppState。

在 iOS 上,它按预期工作:在多任务视图中,应用程序处于非活动状态,一旦切换到其他应用程序状态,就会进入后台。当状态处于非活动状态时,我仍然可以更改 UI。

但是,在 Android 上,状态要么是活动的,要么是后台的。 问题是在后台状态下我无法再更改 UI。

这是 Android 上的错误吗?如果没有,我有什么选择让它在 Android 上运行。

谢谢。

【问题讨论】:

  • 这不是错误。 AppState 组件的 Android 实现只有“活动”和“背景”状态。只是好奇,当用户要离开应用程序时,为什么要显示带有应用程序徽标的全屏视图?
  • 我想显示它,以便敏感数据在多任务视图中不可见。我想我需要深入研究原生的东西。
  • 我也有同样的问题。任何帮助将不胜感激
  • @algizmo 如果你想确保不显示敏感数据,你不应该依赖代码——你的应用程序可能会在没有机会执行代码的情况下被杀死。你应该做的是防止截图。这可以通过在窗口上设置 SECURE 标志来完成:stackoverflow.com/questions/28606689/…;但我不知道 react 是否支持这个

标签: android react-native


【解决方案1】:

如果需要,可以通过在 MainActivity.java 中添加一些代码来监听其生命周期事件来模拟与 iOS 相同的状态

//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);
    }
}

然后在你的 JS 中使用 DeviceEventEmitter 监听这些生命周期变化

const nativeEventListener = DeviceEventEmitter.addListener('ActivityStateChange',
  (e)=>{
      console.log(e.event);
})

【讨论】:

  • 我看不出这有什么不同,并对本机的实现做出反应。它不考虑片段github.com/facebook/react-native/blob/master/ReactAndroid/src/…
  • 对我来说看起来不一样;他在 onPause 上发出“非活动”,而本机反应发出“背景”。然后他在停止时发出“背景”。也就是说,我尝试了这个,但它没有工作/正确模拟 iOS appstate 行为。
【解决方案2】:

对于 android,您可以像这样使用 'background' 而不是 'inactive'

  AppState.addEventListener('change', state => {

  if ( state === 'background') {
    //write your code here
   }

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2018-06-08
    • 2022-10-21
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多