<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
WorkManager 用於處理 Android 後臺任務。我們只需要設定好任務內容、何時執行,剩下的工作就可以完全交給系統處理。它會自動向下相容,在不同的 Android 版本上採用不同的實現方案。
由於是交給系統排程的,它可以保證應用退出甚至手機重啟後,任務依然能夠得到執行。WorkManager 很適合執行一些定期和伺服器互動的任務,比如週期性的同步資料等等。並且,WorkManager 還支援週期性任務、鏈式任務。
需要注意的是,WorkManager 不能保證任務一定能夠準時執行,這是因為系統為了減少電量消耗,會將觸發事件臨近的幾個任務放在一起執行,以減少 CPU 被喚醒的次數,延長電池使用時間。
另外,在國產手機上 WorkManager 可能無法正常執行,這是因為絕大多數手機廠商客製化 Android 系統時,會新增一個“一鍵關閉”的功能,這樣被殺死後的應用程式,既無法接收廣播,也不能執行 WorkManager 的後臺任務。國產手機增加此功能也是迫於無奈,主要是因為市面上有太多的惡意應用想要霸佔後臺。所以,我們在國產手機上不要使用 WorkManager 去實現核心功能。
在 app/build.gradle 中新增依賴:
implementation 'androidx.work:work-runtime:2.3.2'
WorkManager 的用法分為三步:
建立一個 SimpleWorker 類,繼承自 Worker:
class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { Log.d("~~~", "do something") return Result.success() } }
Result.success()
表示任務執行成功
Result.failure()
表示任務執行失敗
Result.retry()
表示任務需要重試。這個方法需要配合任務重試設定一起使用
使用 OneTimeWorkRequest 構建只需執行一次的任務
val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java).build()
使用 PeriodicWorkRequest 構建週期性執行的任務
val request = PeriodicWorkRequest.Builder(SimpleWorker::class.java, 15, TimeUnit.MINUTES).build()
為了減少耗電量,PeriodicWorkRequest 要求任務執行週期不得短於十五分鐘,檢視原始碼可以發現,如果傳入的值短於十五分鐘,系統會列印一條警告,然後自動將週期設定成十五分鐘:
public static final long MIN_PERIODIC_INTERVAL_MILLIS = 15 * 60 * 1000L; // 15 minutes. /** * Sets the periodic interval for this unit of work. * * @param intervalDuration The interval in milliseconds */ public void setPeriodic(long intervalDuration) { if (intervalDuration < MIN_PERIODIC_INTERVAL_MILLIS) { Logger.get().warning(TAG, String.format( "Interval duration lesser than minimum allowed value; Changed to %s", MIN_PERIODIC_INTERVAL_MILLIS)); intervalDuration = MIN_PERIODIC_INTERVAL_MILLIS; } setPeriodic(intervalDuration, intervalDuration); }
WorkManager.getInstance(this).enqueue(request)
這就是 WorkManager 的基本使用。
通過 setInitialDelay 方法設定延遲時間
val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java) .setInitialDelay(5, TimeUnit.MINUTES) .build()
通過 addTag 方法新增標籤:
val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java) .addTag("simple") .build()
新增標籤的作用是,方便我們根據標籤取消任務。
WorkManager.getInstance(this).cancelAllWorkByTag("simple")
WorkManager.getInstance(this).cancelWorkById(request.id)
WorkManager.getInstance(this).cancelAllWork()
通過 setBackoffCriteria 設定任務重試:
val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java) .setBackoffCriteria(BackoffPolicy.LINEAR, 10, TimeUnit.SECONDS) .build()
前文說到,Result.retry() 表示任務需要重試,這個方法需要配合任務重試設定一起使用。任務重試設定就是指這個 setBackoffCriteria 方法,它傳入了三個值,第二個值和第三個值表示重試時間設定。第一個值表示重試延遲的形式,有兩個值可供選擇:
WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.id).observe(this) { Log.d("~~~", "state = ${it.state}, tags = ${it.tags.toList()}") when (it.state) { WorkInfo.State.SUCCEEDED -> Log.d("~~~", "success") WorkInfo.State.FAILED -> Log.d("~~~", "fail") WorkInfo.State.RUNNING -> Log.d("~~~", "running") WorkInfo.State.ENQUEUED -> Log.d("~~~", "enqueued") WorkInfo.State.CANCELLED -> Log.d("~~~", "cancelled") WorkInfo.State.BLOCKED -> Log.d("~~~", "blocked") } }
首先通過 getWorkInfoByIdLiveData 獲得任務資訊的 LiveData<WorkInfo> 資料,然後觀察此資料即可。也可以通過 getWorkInfosByTagLiveData 獲得相同 Tag 的 LiveData<List<WorkInfo>>,觀察這個任務資訊列表。通過 WorkInfo 的 getState 方法獲取任務狀態,主要用到的狀態有 WorkInfo.State.SUCCEEDED 和 WorkInfo.State.FAILED,標誌著任務的成功和失敗。
val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java) .setInputData(Data.Builder().apply { putString("key", "value") }.build()) .build()
SimpleWorker 類中讀取此資料:
inputData.getString("key")
val first = OneTimeWorkRequest.Builder(SimpleWorker::class.java) .build() val second = OneTimeWorkRequest.Builder(SimpleWorker::class.java) .build() val third = OneTimeWorkRequest.Builder(SimpleWorker::class.java) .build() WorkManager.getInstance(this) .beginWith(first) .then(second) .then(third) .enqueue()
通過 beginWith 發起鏈式任務,然後字尾 then 即可,任務會按照連線順序依次執行。WorkManager 要求必須在上一個任務執行成功後,才會執行下一個任務。也就是說任何一個任務的失敗都會導致鏈式任務的中斷。
以上就是Android開發Jetpack元件WorkManager用例詳解的詳細內容,更多關於Android Jetpack元件WorkManager的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45