如何在React Native中正确处理redux saga和后台事件?

时间:2019-08-23 18:33:09

标签: background-process redux-saga

我正在使用react-native,redux-saga,react-native-background-task。

首先,当我的应用程序从前台转到后台(在IOS和Android上)时,传奇继续。我本来希望它停止,但是我猜是因为传奇在另一个线程上继续了。这会引起电池管理问题还是阻止IOS允许应用执行后台获取事件?

第二,当后台任务启动时,在Android应用程序上,我的主传奇像正常情况一样启动(这不是预期的行为,我以为只有后台任务代码才能运行。在IOS上,只有后台任务代码才能像我一样运行)出乎意料。为什么Android应用会再次开始整个传奇?

第三,当我使用xcode来“模拟后台获取”时,它工作了一段时间,但是现在它关闭了所有打开的其他应用程序,并且没有运行任务代码。为什么会这样?

在这里定义后台任务:

BackgroundTask.define(async () => {
    const now = moment().format("HH:mm:ss");
    console.log("Executing background task at: ", now);
    console.log("Test Test Test!");
    BackgroundTask.finish();
});

这是我安排后台任务并包含redux的地方:

import React from 'react';
import { SafeAreaView, View, StatusBar, Alert } from 'react-native';
import { Provider } from 'react-redux';
import { redux_store } from './redux/store';
import { AppContainer } from './helpers/navigation.js';
import { styles } from './styles/styles.js';
import ReduxRootConnection from './components/reduxRoot';
import { aws_configure } from './helpers/aws-configure';
import BackgroundTask from 'react-native-background-task'

aws_configure();

import { initPushNotifications } from './helpers/initPN';

export default class App extends React.Component {

    componentDidMount() {
        // TODO: add this back in
        // initPushNotifications()

        BackgroundTask.schedule();
        this.check_background_task_status();
    }

    async check_background_task_status() {
        const status = await BackgroundTask.statusAsync();
        console.log("BackgroundTask Status: ", status);
    }

    render() {
        return (
            <Provider store={redux_store}>
                <View style={{flex: 1}}>
                    <SafeAreaView style={styles.mainAppContainerStyle}>
                        <ReduxRootConnection>
                            <AppContainer/>
                        </ReduxRootConnection>
                    </SafeAreaView>
                </View>
            </Provider>
        );
    }
}

1 个答案:

答案 0 :(得分:0)

当React本机应用程序在android上后台运行时,这并不意味着活动必然被破坏,因此您的js代码可能会继续运行不确定的时间。最终,如果用户没有再次打开活动,则您的活动可能会停止,但是您不知道确切的时间。您可以使用react native的AppStatehttps://facebook.github.io/react-native/docs/appstate)取消您希望在应用程序进入后台时取消的sagas。

对于后台任务问题,Android上的BackgroundTask实现使用react native的无头js(https://facebook.github.io/react-native/docs/headless-js-android.html)在后台启动整个应用程序。在ios上没有无头js,因此实现方式有所不同。