安排在您的應用處於后台時運行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)=>{});