安排在您的应用处于后台时运行JavaScript的后台任务。
即使应用程序已关闭,任务也会运行,默认情况下,也会在重新启动后继续存在。
这个库依赖于React Native的HeadlessJS ,目前只支持Android。
在本机端,它使用Firebase JobDispatcher
或AlarmManager
。
Firebase JobDispatcher(默认值):无法准确计划任务,并且根据Android API版本允许不同的period段。 FirebaseJobDispatcher是最节省电池效率的后向兼容调度后台任务的方式。
AlarmManager通过将exact设置为true :简单的propriatery实现,仅在测试时使用。 它只关心按时执行,所有其他参数都被忽略 - 重启时不会保留任务。
要求
RN 0.36+
Android API 16+
支持的平台
仅Android
安装
- 下载
$ yarn add react-native-background-job
or
$ npm install react-native-background-job --save
- 自动安装
$ react-native link react-native-background-job
-
手动安装
打开
android/app/src/main/java/[...]/MainActivity.java
添加import com.pilloxa.backgroundjob.BackgroundJobPackage;
到文件顶部的导入
将new BackgroundJobPackage()
添加到MainApplication.java
的getPackages()
方法返回的列表中-
将以下行追加到
android/settings.gradle
:include ':react-native-background-job'
project(':react-native-background-job').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-background-job/android') 在android/app/build.gradle的依赖项块中插入以下行,并将minSdkVersion置为21:
compile project(':react-native-background-job')
用法
每次React Native启动时都必须注册任务,这是使用register
函数完成的。 由于HeadlessJS
不安装任何组件,因此register
函数必须在任何类定义之外运行。
注册任务并不意味着任务已被调度,它只是通知React Native该job函数应该绑定到此jobKey
。 然后使用schedule功能安排任务。 默认情况下,当应用程序位于前台时,任务不会触发 。 这是因为任务是在唯一的JavaScript线程上运行的,如果在app处于前台时运行任务,它将冻结应用程序。 通过将allowExecutionInForeground
设置为true
您可以允许此行为。 建议您不要使用它,但快速工作应该没问题。
API
register
注册任务和应该运行的功能。
这必须在React Native的每次初始化时运行,并且必须在全局范围内运行,而不是在任何组件生命周期方法中运行。 查看示例项目。 仅注册任务不会安排任务。 它必须按schedule才能开始运行。
参数
obj 对象
obj.jobKey string任务的唯一键
obj.job 函数将运行的JS函数
例子
import BackgroundJob from 'react-native-background-job';
const backgroundJob = {
jobKey: "myJob",
job: () => console.log("Running in background")
};
BackgroundJob.register(backgroundJob);
schedule
安排一份新工作。
这只需要运行一次,而在每次初始化React Native时都必须运行register 。
参数
obj 对象
obj.jobKey string用于注册的任务的唯一键,用于在后续阶段取消。
obj.timeout number无论任务是否已完成,都应终止React实例的时间(以毫秒为单位)。 (可选,默认2000 )
obj.period number运行任务的频率(以ms为单位)。 这个数字不准确,Android可能会修改它以节省电池。 注意:对于Android> N,最小值为900 0000(15分钟)。 (可选,默认900000 )
obj.persist boolean如果任务应该在设备重启时保持obj.persist 。 (可选,默认为true )
obj.override boolean此任务是否应使用相同的键替换预先存在的任务。 (可选,默认为true )
obj.networkType number仅针对特定网络要求运行。 (可选,默认NETWORK_TYPE_NONE )
obj.requiresCharging boolean仅在设备正在充电时运行任务(未被Android N设备预备) docs (可选,默认为false )
obj.requiresDeviceIdle boolean仅在设备空闲时运行任务(未被Android N设备预备) docs (可选,默认为false )
obj.exact boolean安排在提供的时间段内准确触发的任务。 请注意,这不是节能的做事方式。 (可选,默认为false )
obj.allowWhileIdle boolean允许预定任务在打盹模式下执行。 (可选,默认为false )
obj.allowExecutionInForeground boolean即使应用程序位于前台,也允许执行预定任务。 仅用于短期任务。 (可选,默认为false )
例子
import BackgroundJob from 'react-native-background-job';
const backgroundJob = {
jobKey: "myJob",
job: () => console.log("Running in background")
};
BackgroundJob.register(backgroundJob);
var backgroundSchedule = {
jobKey: "myJob",
}
BackgroundJob.schedule(backgroundSchedule);
cancel
取消特定的工作
参数
obj 对象
obj.jobKey string作业的唯一键
例子
import BackgroundJob from 'react-native-background-job';
BackgroundJob.cancel({jobKey: 'myJob'});
cancelAll
取消所有预定作业
例子
import BackgroundJob from 'react-native-background-job';
BackgroundJob.setGlobalWarnings(false);
setGlobalWarnings
设置全局警告级别
参数
warn 布尔
例子
import BackgroundJob from 'react-native-background-job';
BackgroundJob.setGlobalWarnings(false);
isAppIgnoringBatteryOptimization
检查应用程序是否使用Doze优化电池,返回布尔值。
参数
callback从Android模块收到结果后,使用相应的参数callback 回调 。
例子
import BackgroundJob from 'react-native-background-job';
BackgroundJob.isAppIgnoringBatteryOptimisation((error,ignoringOptimization)=>{});