[英]Background processing in modern Android
我已經使用WorkManager和使用 this Guide實現了一些后台任務。 有一次我需要使用CoroutineWorker 。 我發現這些指南非常好,但是每次我需要對后台處理提出新要求時,我都會開始對我需要的東西進行新的研究。 所以我的問題是用現代 Android 解決以下用例的正確方法是什么。 另外請考慮不同的手機品牌會挑釁地殺死后台任務(有些品牌對后台處理更苛刻)。 我什么時候需要使用持久通知,什么時候不需要,什么時候使用AlarmManger 。 請為每個人寫下最佳實施方式以及是否需要持續通知。
用例:
1.下載大文件(500mb)
一個。 每天一次,在准確的時間
b 每天一次,只要操作系統可以,在任何時間
2.下載小文件(5k)
一個。 每天一次,在准確的時間
b 每天一次,只要操作系統可以,在任何時間
3.在准確的時間設置鬧鍾
4. 與服務器同步DB(大數據約5分鍾運行時間)
一個。 每 15 分鍾( 最短時間?)
灣。 一天一次
5. 與服務器同步DB(運行時小於1秒的小數據)
一個。 每 5 分鍾
灣。 每 15 分鍾
C。 一天一次
請查看我在此處給出的答案以獲取更多信息:
1.下載大文件(500mb)
一個。 每天一次在准確的時間- 你可以在這里設置一個准確的警報,但是你會遇到 Android 12 從后台啟動服務的限制(更多關於這在其他評論中)。 所以這取決於用例。 我只是不會去那里。
b 操作系統可以在任何時候每天一次 -使用 WorkManager,但理論上它取決於電源存儲桶,所以如果你進入較低的存儲桶,你可能會超過一天。 此外,開始和結束是不同的。 您可能會開始達到每天 10 分鍾的限制。 (更多關於這在其他評論)
2. 下載小文件(5k) 每天一次在准確的時間 -作為一個大文件。
b 每天一次,操作系統可以在任何時間 -作為一個大文件。
3.在准確的時間設置鬧鍾 -這取決於你做什么。 我不明白這個
4. 將數據庫與服務器同步(大約 5 分鍾運行時間的大數據) ——你需要 WorkManager 來處理這樣的事情。
對於以上所有 - 15 分鍾來自打盹模式。 但即使它也有“兩種口味”。 這 15 分鍾只是理論上的。 實際上可能更多。 WorkManager 具有“周期性工作”的概念。 實際上沒有這樣的事情。 WorkManager 使用約束的概念。 所以你有你需要一個網絡的限制,你有一個需要充電的設備的限制,你有一個“時間限制”。 所以你看 - 24 小時的“定期工作”只是一項具有額外約束的工作:“不要在 24 小時內開始”。 但這並不意味着“每 24 小時”。 理論上 24 可能已經過去,時間限制得到滿足,然后由於其他原因,您在 1 周內成功執行,並且再次重新安排了工作,並有另外 24 小時的時間限制。
對於“每 5 分鍾、15 分鍾、15 分鍾”之類的內容 - 只需在服務通知中使用以下文本提出服務:“我們的應用程序討厭你的電池”,永遠不要停止它,做任何你需要的事情 :) 但完全反對新的安卓概念。
即使您使用推送通知(如果它們不是高優先級),您也將有效地回退到 WorkManager 以便稍后完成工作。
就像我說的:“一天一次”的意思是“很可能一天一次”
一個。 每 15 分鍾(最短時間?)
灣。 一天一次
5. 與服務器同步DB(運行時小於1秒的小數據)
一個。 每 5 分鍾
灣。 每 15 分鍾
C。 一天一次
根據 WorkManager 的這個參考,你可以通過它來調度三種類型的持久化工作,
- 立即:必須立即開始並很快完成的任務。 可能會加急。
- 長時間運行:可能運行時間更長,可能超過 10 分鍾的任務。
- Deferrable :計划的任務在以后開始並且可以定期運行。
這意味着您的大多數用例都可以通過使用 WorkManager 來實現,除了您需要它運行“每 5 分鍾”和“在准確時間設置警報”的兩種情況。
從這里建議,如果您想在准確的時間設置警報,則不應使用 WorkManager,而應使用 AlarmManager,即使在指定時間從打盹模式中喚醒設備。
檢查工作經理提供的所有可能的執行: (由WorkManager 指南提供)
因此,以下是您可以根據用例使用的所有可能方法:
下載大文件(500mb)
一個。 每天一次,在准確的時間
答:您可以在此處使用從給定開始時間開始每 24 小時安排一次的 PeriodicWork,因為它是長時間運行的操作,您可以使其加速/前台來跟蹤正在進行的進度。 盡管請記住,下載需要有效的互聯網連接,如果不可用,則在指定的時間間隔內下載,然后將被安排延遲/稍后執行。
PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Additional configuration .build() //Calling setForeground() from doWork() will show ongoing notification
灣。 每天一次,操作系統可以,任何時間
答:這是您可以使用 PeriodicWork 不確定地執行某些任務的最佳示例。 在這里,您可以使其可延遲,因為它不需要在特定時間執行。
PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS) // Additional configuration .build() //Calling setForeground() from doWork() will show ongoing notification
下載小文件(5k)
一個。 每天一次,在准確的時間
答:可以是 PeriodicWork,安排 24 小時立即執行(加急工作),因為下載小文件不會花很長時間。
PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Additional configuration .build()
灣。 每天一次,操作系統可以,任何時間
答:它可以是具有可延遲執行的 PeriodicWork,可以安排在 24 小時。
PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS) // Additional configuration .build()
在准確的時間設置鬧鍾
答:要設置鬧鍾在准確的時間執行,您應該使用 AlarmManager。 WorkManager 無法使用此用例,因為它不會中斷打盹模式(設備的深度睡眠)。
與服務器同步數據庫(大數據約 5 分鍾運行時間)
一個。 每 15 分鍾(最短時間?)
回答:這可以安排為每 15 分鍾一次的 PeriodicWork,因為它是長期運行的前台工作。
PeriodicWorkRequestBuilder<SyncToServerWorker>(15, TimeUnit.MINUTES) // Additional configuration .build() //Calling setForeground() from doWork() will show ongoing notification
灣。 一天一次
回答:這可以是每 24 小時安排一次的 PeriodicWork,因為它是長期運行的前台工作。
PeriodicWorkRequestBuilder<SyncToServerWorker>(1, TimeUnit.DAYS) // Additional configuration .build() //Calling setForeground() from doWork() will show ongoing notification
與服務器同步數據庫(運行時小於 1 秒的小數據)
一個。 每 5 分鍾
答:此用例無法實現,因為 WorkManager 定期工作的最短時間為 15 分鍾。 因此,建議通過前台服務/警報管理器組合手動管理此周期性工作。
灣。 每 15 分鍾
答:這可以通過每 15 分鍾安排一次的 PeriodicWork 來實現,可以根據需要的緊急/放松程度來加快或推遲。
PeriodicWorkRequestBuilder<SyncDataWorker>(15, TimeUnit.MINUTES) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Decide whether to make it expedited or deferrable here conditionally // Additional configuration .build()
C。 一天一次
回答:這是每 24 小時安排一次的 PeriodicWork 示例,可以根據需要的緊急/放松程度加快或推遲。
PeriodicWorkRequestBuilder<SyncDataWorker>(1, TimeUnit.DAYS) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Decide whether to make it expedited or deferrable here conditionally // Additional configuration .build()
創建長期運行工作者的參考: https ://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.