我正在使用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>
);
}
}
答案 0 :(得分:0)
当React本机应用程序在android上后台运行时,这并不意味着活动必然被破坏,因此您的js代码可能会继续运行不确定的时间。最终,如果用户没有再次打开活动,则您的活动可能会停止,但是您不知道确切的时间。您可以使用react native的AppState
(https://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,因此实现方式有所不同。