Javascript React Native、Android生命周期和导航

Javascript React Native、Android生命周期和导航,javascript,react-native,react-native-android,redux-persist,Javascript,React Native,React Native Android,Redux Persist,我们正在构建一个React本机应用程序,它使用redux persist存储应用程序状态,包括导航状态。我希望此应用在导航方面表现得像本地应用: 当本机Android应用进入后台,最终被操作系统停止,然后移动到前台时,它将在用户先前停止的活动中恢复。如果相同的应用程序被用户杀死(或崩溃),它将在主活动中打开 对于RN应用程序,这意味着redux persist应保持并恢复应用程序组件WillMount中的导航状态,但前提是该应用程序未被用户杀死 以下代码起作用: componentWillMou

我们正在构建一个React本机应用程序,它使用redux persist存储应用程序状态,包括导航状态。我希望此应用在导航方面表现得像本地应用:

当本机Android应用进入后台,最终被操作系统停止,然后移动到前台时,它将在用户先前停止的活动中恢复。如果相同的应用程序被用户杀死(或崩溃),它将在主活动中打开

对于RN应用程序,这意味着redux persist应保持并恢复应用程序组件WillMount中的导航状态,但前提是该应用程序未被用户杀死

以下代码起作用:

componentWillMount() {
  if (global.isRelaunch) {
    // purge redux-persist navigation state
  }
  global.isRelaunch = true;
...
但它看起来很粗糙,我也不明白为什么全球范围仍然存在

检测RN应用程序是否从后台重新打开的正确方法是什么?(理想情况下支持iOS)

您应该看看
react native

检查此示例:

import React, {Component} from 'react'
import {AppState, Text} from 'react-native'

class AppStateExample extends Component {

  state = {
    appState: AppState.currentState
  }

  componentDidMount() {
    AppState.addEventListener('change', this._handleAppStateChange);
  }

  componentWillUnmount() {
    AppState.removeEventListener('change', this._handleAppStateChange);
  }

  _handleAppStateChange = (nextAppState) => {
    if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
      console.log('App has come to the foreground!')
    }
    this.setState({appState: nextAppState});
  }

  render() {
    return (
      <Text>Current state is: {this.state.appState}</Text>
    );
  }

}
import React,{Component}来自“React”
从“react native”导入{AppState,Text}
类AppStateExample扩展组件{
状态={
appState:appState.currentState
}
componentDidMount(){
AppState.addEventListener('change',this.\u handleAppStateChange);
}
组件将卸载(){
AppState.removeEventListener('change',this.\u handleAppStateChange);
}
_HandLeapStateChange=(nextAppState)=>{
if(this.state.appState.match(/inactive | background/)和&nextapstate=='active'){
console.log('应用程序已到达前台!')
}
this.setState({appState:nextapstate});
}
render(){
返回(
当前状态为:{this.state.appState}
);
}
}

@semirtargay的答案是一种检测离开应用程序的方法。对于Android来说,检测主页或最近的应用程序按钮点击是更好的方法。这是因为你的应用程序中来自其他应用程序(如社交媒体或照片)的片段也会触发背景状态,而你不想触发背景状态,因为它们仍在应用程序中,通过摄像头等向个人资料添加照片。你可以轻松检测Android上的主页和最近的应用程序按钮点击。此库仅公开android按钮事件

首先在按下npm i react native home(npm i react native home)(保存)的情况下安装库,然后将其链接到
react native link
。然后重建应用程序并添加以下代码段。
从'react native'导入{DeviceEventEmitter}
类ExampleComponent扩展组件{
componentDidMount(){
this.onHomeButtonPressSub=DeviceEventEmitter.addListener(
“打开主页按钮”,
() => {
console.log('您点击了home按钮!')
})
this.onRecentButtonPressSub=DeviceEventEmitter.addListener(
“在最近的应用程序上按下按钮”,
() => {
console.log('您点击了最近的应用程序按钮!')
})
}
componentWillUnmount():void{
如果(this.onRecentButtonPressSub)this.onRecentButtonPressSub.remove()
如果(this.onHomeButtonPressSub)this.onHomeButtonPressSub.remove()
}

}
我看不出AppState在这里有什么帮助。我如何使用此代码检测应用程序是否从后台重新打开?如果Android(在后台)关闭该应用程序,然后用户重新打开它,则会发生以下情况:
\u handleAppStateChange
触发并且
nextapstate
处于活动状态。但是,
this.state.appState
未定义(因为应用已被终止)。如果应用程序是从头开始的,同样的事情也会发生。你在回答自己的问题。如果以前的状态是后台或非活动状态,而现在是前台,则需要重置本地状态。如果前一个未定义,只需从头开始,因为应用程序已被终止(与谁无关),这与谁终止进程无关!如果用户明确终止了应用程序,我想重置导航状态。但是,如果Android操作系统终止了进程,我不想重置状态——在本机应用程序上,在这种情况下,可以使用savedInstanceState恢复状态。