私たちは、redux-persistを使用してナビゲーション状態を含むアプリ状態を保存するReact Nativeアプリを構築しています。このアプリがネイティブアプリのように動作するようにしたいと考えています。React Native、Androidのライフサイクルとナビゲーション
ネイティブAndroidアプリがバックグラウンドに入り、最終的にOSによって停止され、フォアグラウンドに移行すると、ユーザーが以前に中止したアクティビティ同じアプリがユーザー(またはクラッシュ)によって殺された場合、メインのアクティビティで開きます。
RNアプリの場合、これはredux-persistがアプリのcomponentWillMountのナビゲーション状態を維持して復元する必要があることを意味します。ただし、アプリがユーザーによって強制終了されなかった場合のみです。
次のコードは動作します:
componentWillMount() {
if (global.isRelaunch) {
// purge redux-persist navigation state
}
global.isRelaunch = true;
...
しかし、それはハック見て、グローバルスコープが存続なぜ私も理解していません。
RNアプリがバックグラウンドから再オープンされたかどうかを検出する適切な方法は何ですか? semirturgayの答え@
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>
);
}
}
私はAppStateはここに助ける方法を見ていません。このコードを使用して、アプリがバックグラウンドから再開されたかどうかを検出するにはどうすればよいですか? Androidが(バックグラウンドで)アプリを抹殺し、ユーザーがそれを再び開くと、次のようになります。 '_handleAppStateChange'が起動し、' nextAppState'が 'アクティブ'です。しかし、 'this.state.appState'は(アプリケーションが殺されたため)未定義です。アプリが最初から起動された場合、まったく同じことが起こります。 –
あなた自身の質問に答えています。以前の状態がバックグラウンドまたは非アクティブで、現在はフォアグラウンドになっている場合は、natigation状態をリセットする必要があります。前の定義が未定義の場合は、アプリが殺されたためにゼロから開始します(誰に関係なく) – sfratini
誰がプロセスを殺したかは問題です!ユーザーが明示的にアプリを強制終了した場合は、ナビゲーション状態をリセットします。しかし、Android OSがプロセスを殺した場合、私は状態をリセットしたくありません。ネイティブアプリでは、この場合は状態を復元するためにsavedInstanceStateを使います。 –