WorkManager作用
- 在后臺(tái)執(zhí)行任務(wù)的需求是十分常見的,Android也提供了多種解決方案,如JobScheduler,Loader,Server等,如果這些API沒有被恰當(dāng)使用,則可能會(huì)消耗大量電量。Android在解決應(yīng)用程序耗電問題上各種嘗試,從Doze到APP Standby,通過各種方式限制和管理應(yīng)用程序,以保證應(yīng)用不會(huì)再后臺(tái)消耗過多的設(shè)備電量。Workmanager為應(yīng)用程序中那些不需要及時(shí)完成的任務(wù)提供了一個(gè)統(tǒng)一的解決方案,以便在設(shè)備電量和用戶體驗(yàn)之間達(dá)到一個(gè)比較好的平衡。
WorkManager的兼容方案
- WorkManager能根據(jù)設(shè)備的情況,選擇不同的執(zhí)行方案。在API Level 23以上設(shè)備中,通過JobScheduler完成任務(wù),在API Level 23以下的設(shè)備中,通過ALarmManager和Broadcast Receivers組合來完成任務(wù)。但無論采用哪種方案,任務(wù)最重由Executor來執(zhí)行
- 另外,WorkManager不是一種新的工作線程,它的出現(xiàn)不是為了替代其他類型的工作線程,工作線程通常立即運(yùn)行,并在任務(wù)執(zhí)行完成后給用戶反饋。而WorkManager不是即時(shí)的,它不能保證任務(wù)立即執(zhí)行
WorkManager的使用方法
- 添加依賴
- 使用Work類定義任務(wù)
- 使用WorkRequest配置任務(wù)
- 設(shè)置任務(wù)觸發(fā)條件
- 將任務(wù)觸發(fā)條件設(shè)置到WorkRequest
- 設(shè)置延遲執(zhí)行任務(wù)
- 設(shè)置指數(shù)退避策略
- 為任務(wù)設(shè)置Tag標(biāo)簽
WorkManager的使用方法
- 將任務(wù)交給系統(tǒng)
- 觀察任務(wù)的狀態(tài)
- 取消任務(wù)
- 參數(shù)傳遞
- 周期性任務(wù)
- 任務(wù)鏈
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
val inputData = inputData.getString("data")
SystemClock.sleep(2000)
Log.e("lyb=======", "MyWorker doWork $inputData")
//任務(wù)執(zhí)行完返回?cái)?shù)據(jù)
val putString = Data.Builder().putString("outputData", "執(zhí)行成功").build()
return Result.success(putString)
}
}
fun mAddWork(view : View){
// 設(shè)置觸發(fā)條件
val constraints = Constraints.Builder()
// NetworkType.NOT_REQUIRED 對(duì)網(wǎng)絡(luò)沒有要求
// NetworkType.CONNECTED 網(wǎng)絡(luò)連接的時(shí)候執(zhí)行
// NetworkType.UNMETERED 不計(jì)費(fèi)的網(wǎng)絡(luò)比如WIFI下執(zhí)行
//NetworkType.NOT_ROAMING 非漫游網(wǎng)絡(luò)狀態(tài)
//NetworkType.METERED 計(jì)費(fèi)網(wǎng)絡(luò)比如 3G 4G 不執(zhí)行
// .setRequiresBatteryNotLow(true) //不在電量不足執(zhí)行
// .setRequiresCharging(true) // 在充電時(shí)執(zhí)行
// .setRequiresStorageNotLow(true) //不在存儲(chǔ)容量不足時(shí)執(zhí)行
// .setRequiresDeviceIdle(true) //在待機(jī)狀態(tài)下執(zhí)行 調(diào)用需要API級(jí)別最低為23
.setRequiredNetworkType(NetworkType.NOT_REQUIRED)
.build()
val inputData = Data.Builder()
.putString("data","workRequest")
.build()
val workRequest = OneTimeWorkRequest.Builder(MyWorker::class.java)
.setConstraints(constraints)
//設(shè)置延遲執(zhí)行
.setInitialDelay(5,TimeUnit.SECONDS)
//指數(shù)退避策略
// .setBackoffCriteria(BackoffPolicy.LINEAR, Duration.ofSeconds(2L))
//設(shè)置Tag標(biāo)簽
.addTag("workRequest")
//傳遞參數(shù)
.setInputData(inputData)
.build()
//周期性任務(wù)
// val workRequest1 = PeriodicWorkRequest.
// Builder(MyWorker::class.java, Duration.ofMillis(15)).build()
//任務(wù)鏈
//val workA = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workB = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//WorkManager.getInstance(this)
// .beginWith(workA)
// .then(workB)
// .enqueue()
//任務(wù)鏈組合
//val workA = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workB = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workC = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workD = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workE = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val continuation1 = WorkManager.getInstance(this)
// .beginWith(workA).then(workB)
//val continuation2 = WorkManager.getInstance(this)
// .beginWith(workC).then(workD)
//WorkContinuation.combine(listOf(continuation1,continuation2)).then(workE).enqueue()
val workManager = WorkManager.getInstance(this)
workManager.enqueue(workRequest)
// 監(jiān)聽任務(wù)狀態(tài)
workManager.getWorkInfoByIdLiveData(workRequest.id).observe(this){
Log.e("lyb=====",it.toString())
if(it.state == WorkInfo.State.SUCCEEDED){
val output = it.outputData.getString("outputData")
}
}
//取消任務(wù)
// workManager.cancelWorkById(workRequest.id)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。