react-native-background-job——让你的react-native项目实现后台运行

安排在您的应用处于后台时运行JavaScript的后台任务。

即使应用程序已关闭,任务也会运行,默认情况下,也会在重新启动后继续存在。

这个库依赖于React Native的HeadlessJS ,目前只支持Android。

在本机端,它使用Firebase JobDispatcherAlarmManager

  • 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
  • 手动安装

    1. 打开android/app/src/main/java/[...]/MainActivity.java

      添加import com.pilloxa.backgroundjob.BackgroundJobPackage;到文件顶部的导入

      new BackgroundJobPackage()添加到MainApplication.javagetPackages()方法返回的列表中

    2. 将以下行追加到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') 
    3. 在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)=>{});

参考链接