寫在前面:Jetpack的更新速度非常快,可能你一個(gè)月前看WorkManager是這樣用的,下個(gè)月這個(gè)使用方法就有可能被廢棄了(我看源碼的時(shí)候是遇到過的,而且源碼也變了,但核心原理是不變的),所以我們這一系列文章偏重講原理,使用就一帶而過(因?yàn)橹v了也沒用啊,會(huì)變的。。。。。,讀者使用最好看官方文檔官方文檔
,當(dāng)然我這里講的也是截止到目前的最新用法)。
Jetpack使用(一)Lifecycles核心原理
Jetpack使用(二)LiveData核心原理
Jetpack使用(三)DataBinding核心原理
Jetpack使用(四)ViewModel核心原理
Jetpack使用(五)Navigation核心原理
Jetpack使用(六) WorkManager的4種用法
WorkManager有什么用:
一:確保重要的后臺(tái)任務(wù),一定會(huì)被執(zhí)行,后臺(tái)任務(wù)(例如:非及時(shí)性的 (請(qǐng)求服務(wù)器 及時(shí)性) 上傳,下載,同步數(shù)據(jù) 等)
二:內(nèi)部對(duì)電量進(jìn)行了優(yōu)化,不需要我們?nèi)ヌ幚黼娏績?yōu)化了
三:API 14 到 最新版本,都可以使用WorkManager來管你你的后臺(tái)任務(wù)
四:注意:WorkManager不能做?;畈僮?/p>
五:調(diào)度,管理,執(zhí)行的后臺(tái)任務(wù)的場(chǎng)景,通常是是可延遲的后臺(tái)任務(wù)
注意:WorkManager之所以能做到這些,其實(shí)就是通過使用android系統(tǒng)的服務(wù)來管理Room數(shù)據(jù)庫里的任務(wù)列表來來完成的。
使用
新建一個(gè)后臺(tái)任務(wù)MainWorkManager
/**
* 后臺(tái)任務(wù)
*/
public class MainWorkManager extends Worker {
public final static String TAG = MainWorkManager.class.getSimpleName();
private Context mContext;
private WorkerParameters workerParams;
// 有構(gòu)造函數(shù)
public MainWorkManager(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
this.mContext = context;
this.workerParams = workerParams;
}
@SuppressLint("RestrictedApi")
@NonNull
@Override
public Result doWork() {
Log.d(TAG, "doWork: 后臺(tái)任務(wù)執(zhí)行了");
// 接收Activity傳遞過來的數(shù)據(jù)
final String dataString = workerParams.getInputData().getString("wdy");
Log.d(TAG, "doWork: 接收Activity傳遞過來的數(shù)據(jù):" + dataString);
// 反饋數(shù)據(jù) 給 Activity
// 把任務(wù)中的數(shù)據(jù)回傳到activity中
Data outputData = new Data.Builder().putString("wdy", "三分歸元?dú)?).build();
Result.Success success = new Result.Success(outputData);
// return new Result.Failure(); // 本地執(zhí)行 doWork 任務(wù)時(shí) 失敗
// return new Result.Retry(); // 本地執(zhí)行 doWork 任務(wù)時(shí) 重試
// return new Result.Success(); // 本地執(zhí)行 doWork 任務(wù)時(shí) 成功 執(zhí)行任務(wù)完畢
return success;
}
}
- 1、單一任務(wù)和MainActivity互傳數(shù)據(jù)
public void testBackgroundWork1(View view) {
// 單一的任務(wù) 一次
OneTimeWorkRequest oneTimeWorkRequest1;
// 數(shù)據(jù)
Data sendData = new Data.Builder().putString("wdy", "九陽神功").build();
// 請(qǐng)求對(duì)象初始化
oneTimeWorkRequest1 = new OneTimeWorkRequest.Builder(MainWorkManager.class)
.setInputData(sendData) // 數(shù)據(jù)的攜帶
.build();
WorkManager.getInstance(this).getWorkInfoByIdLiveData(oneTimeWorkRequest1.getId())
.observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
Log.d(MainWorkManager.TAG, "Activity取到了任務(wù)回傳的數(shù)據(jù): " + workInfo.getOutputData().getString("wdy"));
Log.d(MainWorkManager.TAG, "狀態(tài):" + workInfo.getState().name());
if (workInfo.getState().isFinished()) {
Log.d(MainWorkManager.TAG, "狀態(tài):isFinished=true 后臺(tái)任務(wù)已經(jīng)完成了...");
}
}
});
// 請(qǐng)求對(duì)象 加入到隊(duì)列
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest1);
}
- 2、多個(gè)任務(wù)
public void testBackgroundWork2(View view) {
OneTimeWorkRequest oneTimeWorkRequest2 = new OneTimeWorkRequest.Builder(MainWorkManager2.class).build();
OneTimeWorkRequest oneTimeWorkRequest3 = new OneTimeWorkRequest.Builder(MainWorkManager3.class).build();
OneTimeWorkRequest oneTimeWorkRequest4 = new OneTimeWorkRequest.Builder(MainWorkManager4.class).build();
OneTimeWorkRequest oneTimeWorkRequest5 = new OneTimeWorkRequest.Builder(MainWorkManager5.class).build();
// 順序執(zhí)行
WorkManager.getInstance(this).beginWith(oneTimeWorkRequest2)
.then(oneTimeWorkRequest3)
.then(oneTimeWorkRequest4)
.then(oneTimeWorkRequest5)
.enqueue();
}
- 3、重復(fù)執(zhí)行任務(wù)
public void testBackgroundWork3(View view) {
// 重復(fù)的任務(wù) 多次 循環(huán) , 最少循環(huán)重復(fù) 15分鐘(少于15分鐘默認(rèn)為15分鐘)
PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(MainWorkManager2.class, 20, TimeUnit.SECONDS).build();
// 監(jiān)聽狀態(tài)
WorkManager.getInstance(this).getWorkInfoByIdLiveData(periodicWorkRequest.getId())
.observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
Log.d(MainWorkManager.TAG, "狀態(tài):" + workInfo.getState().name());
if (workInfo.getState().isFinished()) {
Log.d(MainWorkManager.TAG, "狀態(tài):isFinished=true 后臺(tái)任務(wù)已經(jīng)完成了...");
}
}
});
WorkManager.getInstance(this).enqueue(periodicWorkRequest);
}
- 4、約束條件
public void testBackgroundWork4(View view) {
// 約束條件,必須滿足我的條件,才能執(zhí)行后臺(tái)任務(wù) (在連接網(wǎng)絡(luò),插入電源 并且 處于空閑時(shí)) 內(nèi)部做了電量優(yōu)化(Android App 不耗電)
Constraints myConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 網(wǎng)絡(luò)鏈接中...
.setRequiresCharging(true) // 充電中..
.setRequiresDeviceIdle(true) // 空閑時(shí).. (cpu使用率低)
.build();
/**
* 除了上面設(shè)置的約束外,WorkManger還提供了以下的約束作為Work執(zhí)行的條件:
* setRequiredNetworkType:網(wǎng)絡(luò)連接設(shè)置
* setRequiresBatteryNotLow:是否為低電量時(shí)運(yùn)行 默認(rèn)false
* setRequiresCharging:是否要插入設(shè)備(接入電源),默認(rèn)false
* setRequiresDeviceIdle:設(shè)備是否為空閑,默認(rèn)false
* setRequiresStorageNotLow:設(shè)備可用存儲(chǔ)是否不低于臨界閾值
*/
// 請(qǐng)求對(duì)象
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MainWorkManager2.class)
.setConstraints(myConstraints)
.build();
// 測(cè)試:監(jiān)聽狀態(tài)
// 監(jiān)聽狀態(tài)
WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.getId())
.observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
Log.d(MainWorkManager.TAG, "狀態(tài):" + workInfo.getState().name());
if (workInfo.getState().isFinished()) {
Log.d(MainWorkManager.TAG, "狀態(tài):isFinished=true 后臺(tái)任務(wù)已經(jīng)完成了...");
}
}
});
// 加入隊(duì)列
WorkManager.getInstance(this).enqueue(request);
}