簡體   English   中英

現代Android中的后台處理

[英]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。 一天一次

請查看我在此處給出的答案以獲取更多信息:

Android 推薦和可靠的 API 用於定期后台工作?

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 流程 (由WorkManager 指南提供)

因此,以下是您可以根據用例使用的所有可能方法:

  1. 下載大文件(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
  2. 下載小文件(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()
  3. 在准確的時間設置鬧鍾

    答:要設置鬧鍾在准確的時間執行,您應該使用 AlarmManager。 WorkManager 無法使用此用例,因為它不會中斷打盹模式(設備的深度睡眠)。

  4. 與服務器同步數據庫(大數據約 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
  5. 與服務器同步數據庫(運行時小於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM