簡介
WorkManger是Android Jetpack提供執(zhí)行后臺任務管理的組件,它適用于需要保證 系統(tǒng)即使應用程序退出也會運行的任務,WorkManager API可以輕松指定可延遲的 異步任務以及何時運行它們,這些API允許您創(chuàng)建任務并將其交給WorkManager立 即運行或在適當?shù)臅r間運行。
WorkManager根據(jù)設備API級別和應用程序狀態(tài)等因素選擇適當?shù)姆绞絹磉\行任 務。如果WorkManager在應用程序運行時執(zhí)行您的任務之一,WorkManager可以 在您應用程序進程的新線程中運行您的任務。如果您的應用程序未運行, WorkManager會選擇一種合適的方式來安排后臺任務 - 具體取決于設備API級別和包 含的依賴項,WorkManager可能會使用 JobScheduler,F(xiàn)irebase JobDispatcher或 AlarmManager
WorkManager作用
一:確保重要的后臺任務,一定會被執(zhí)行,后臺任務(例如:非及時性的 (請求服 務器 及時性) 上傳,下載,同步數(shù)據(jù) 等)
二:內(nèi)部對電量進行了優(yōu)化,不需要我們?nèi)ヌ幚黼娏績?yōu)化了
三:API 14 到 最新版本,都可以使用WorkManager來管你你的后臺任務
四:注意:WorkManager不能做保活操作 (重復執(zhí)行后臺任務的最少執(zhí)行單位是 15分鐘,源碼內(nèi)部限制)
WorkManager的各個角色
Worker:指定需要執(zhí)行的任務,可以成為Workder類的子類,在實
現(xiàn)的方法中,就可以執(zhí)行任務邏輯了
WorkRequest:執(zhí)行一項單一的任務
第一點:必須知道 WorkRequest對象,必須指定Work執(zhí)行的任務
第二點:需要知道 WorkRequest都有一個自動生成的唯一ID,可以使用ID執(zhí)行取消 排隊任務 或 獲取任務狀態(tài)等操作
第三點:需要知道 WorkRequest是一個抽象的類;系統(tǒng)默認實現(xiàn)子類 OneTimeWorkRequest或PeriodicWorkRequest
第四點:需要知道 WorkRequest.Builder創(chuàng)建WorkRequest對象;相應的子類: OneTimeWorkRequest.Builder或PeriodicWorkRequest.Builder
第五點:需要知道 Constraints:指定對任務運行時間的限制(任務約束);使用 Constraints.Builder創(chuàng)建Constraints對象 ,并傳遞給WorkRequest.Builder
主線流程
使用方式
implementation "androidx.work:work-runtime:2.3.4"
1.創(chuàng)建一個任務
創(chuàng)建一個類,繼承自Worker
public class MainWorker1 extends Worker {
private final static String TAG = MainWorker1.class.getSimpleName();
public MainWorker1(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
// 后臺任務 并且 異步的
@NonNull
@Override
public Result doWork() {
Log.d(TAG, "MainWorker1 doWork: run started ... ");
try {
Thread.sleep(8000); // 睡眠
} catch (InterruptedException e) {
e.printStackTrace();
return Result.failure(); // 本次任務失敗
} finally {
Log.d(TAG, "MainWorker1 doWork: run end ... ");
}
return Result.success(); // 本次任務成功
}
}
2.執(zhí)行任務
OneTimeWorkRequest oneTimeWorkRequest =
new OneTimeWorkRequest.Builder(MainWorker1.class).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);