Android9Android8中服務Service的限制與解決方案
隨著近幾年來 Android 的不斷髮展,Google 逐步加強了對於後臺執行的優化和限制。為了開發出現代化的 Android 應用,開發者需要學習如何通過最新方式來管理後臺任務。
系統如何判定應用處於後臺?
在理解後臺執行這個概念之前,我們先來看看 Android 系統是如何定義前臺應用的。當應用滿足以下任意條件時,系統會判斷應用處於前臺:
-
具有一個可見的 Activity,不論該 Activity 處於 started 或是 paused 狀態
-
具有一個前臺服務
-
另一個前臺應用已關聯至該應用,不論是通過繫結到它的一個服務,還是通過使用它的一個內容提供程式。比如,當別的前臺應用或者系統綁定了該應用的以下服務時,那麼該應用處於前臺:
-
輸入法
-
桌布服務
-
通知監聽器
-
語音或文字服務
-
正在車內播放音樂的流媒體應用 (只適用於 Android Auto 車載娛樂系統)
-
-
前臺服務:
-
繫結到它的一個服務:
https://developer.android.google.cn/guide/components/bound-services
-
內容提供程式:
https://developer.android.google.cn/guide/topics/providers/content-providers
-
輸入法:
https://developer.android.google.cn/guide/topics/text/creating-input-method
-
桌布服務:
https://developer.android.google.cn/reference/android/service/wallpaper/WallpaperService
-
通知監聽器:
-
語音:
https://developer.android.google.cn/reference/android/service/voice/VoiceInteractionService
-
文字:
https://developer.android.google.cn/reference/android/service/textservice/package-summary
如果以上條件均不滿足,應用將被視為處於後臺。
後臺執行的相關行為變更
在後臺執行應用會消耗裝置的有限資源,如記憶體或者電池電量,進而影響使用者的使用體驗,比如說,後臺任務可能會縮短裝置的續航時間,或者在使用者玩遊戲、看視訊或拍照時造成系統卡頓。
為了改善續航表現和使用者體驗,Android 在版本演進的過程中,針對後臺執行進行了不同程度的限制,其中包括:
-
低耗電模式和應用待機模式: 如果裝置未插接電源,處於空閒狀態一段時間且螢幕關閉,系統會進入低耗電或者待機模式,並對應用行為施加相應限制;
-
後臺位置限制: 對後臺應用獲取使用者當前位置的頻率進行限制;
-
後臺服務限制: 限制應用在後臺執行服務,並禁止應用通過隱藏/不可見方式呼叫 CPU 或網路資源;
-
近期新增特性及優化項: (1) 應用待機群組: 限制非活躍應用對裝置資源的呼叫; (2) 後臺限制: 當系統檢測到應用出現不良行為時,系統會向用戶詢問是否要限制該應用在後臺訪問裝置資源; (3) 省電助手功能優化。
-
文章出處:https://blog.csdn.net/pangzaifei/article/details/70213731
-
低耗電模式和應用待機模式:
https://developer.android.google.cn/about/versions/marshmallow/android-6.0-changes#behavior-power
-
後臺位置限制:
https://developer.android.google.cn/about/versions/oreo/background-location-limits
-
後臺服務限制:
https://developer.android.google.cn/about/versions/oreo/background#services
-
應用待機群組:
https://developer.android.google.cn/preview/features/power#buckets
-
後臺限制:
https://developer.android.google.cn/topic/performance/background-optimization#bg-restrict
-
省電助手功能優化:
https://developer.android.google.cn/about/versions/pie/power#battery-saver
使用案例及解決方案
開發者在選擇後臺執行工具前,首先要對應用需求和限制場景有個清晰的瞭解,我們建議您參照以下流程圖,為應用制定最佳的後臺決策:
-
作為 Android 推薦的後臺管理工具,WorkManger 考慮了系統內的所有後臺執行限制。如果您需要確保推遲的任務一定會被執行,請務必呼叫 WorkManager。該 API 允許您排程任務 (單次執行或迴圈執行) ,組合任務和構成任務鏈。您還可以新增任務執行的約束條件,例如:當裝置空閒或充電時才可以觸發,或者當內容提供程式發生變更時才可以執行。
以上傳日誌為例,您需要依次建立以下兩個工作請求,才可以將壓縮後的日誌檔案上傳至伺服器:-
第一步:壓縮檔案。在此步驟中,您可以新增約束條件 “當裝置充電時,任務才可以被執行”。
-
第二步:向伺服器上傳檔案。在建立此請求時,您應該新增 “需要聯網”這一約束條件,指定任務僅在裝置連線到有效網路時才會被觸發。
-
-
單次執行:
https://developer.android.google.cn/reference/androidx/work/OneTimeWorkRequest
-
迴圈執行:
https://developer.android.google.cn/topic/libraries/architecture/workmanager/basics#recurring
-
組合任務和構成任務鏈:
https://developer.android.google.cn/topic/libraries/architecture/workmanager/advanced#chained
-
約束條件:
https://developer.android.google.cn/reference/androidx/work/Constraints
將任務編入佇列後,WorkManager 會在約束條件滿足的情況下,即當應用可以訪問所需資源時,才會執行這兩個任務。
WorkManger 的另一個優勢在於它可以與 Android 的電量管理特性協同工作。假設某個任務的指定執行時間恰好落在低耗電模式時段內,那麼 WorkManager 便會在維護視窗時段 (如果此時約束條件已滿足,或裝置暫時退出了低耗電模式) ,嘗試執行該任務。
-
如果任務由外部事件觸發且執行時間較長,例如同步新資料,請先使用 Firebase Cloud Messaging 通知您的應用,然後再呼叫 WorkManager 建立同步資料的工作請求。您可以閱讀《使用 FCM 訊息向用戶傳送通知》,獲取更多詳情。
-
如果應用需要立刻執行一個由使用者發起的任務,即使使用者退出應用或關閉螢幕 (如音樂/視訊重放或者導航) 也不會影響任務的執行,請您使用前臺服務。(我們將在下一篇連載中深度剖析該使用案例,敬請期待!)
-
如果您需要在某一特定時間執行一個無法被推遲的任務,且該任務會觸發操作 (action) 並涉及使用者互動,請呼叫 AlarmManager 中的 setExactAndAllowWhileIdle 方法。常見的定時任務包括:
-
服藥提醒
-
電視節目開始前,向用戶傳送的提醒通知
-
-
維護視窗:
https://developer.android.google.cn/training/monitoring-device-state/doze-standby#understand_doze
-
Firebase Cloud Messaging:
-
前臺服務:
https://developer.android.google.cn/guide/components/services
-
AlarmManager:
https://developer.android.google.cn/reference/android/app/AlarmManager
-
setExactAndAllowWhileIdle:
在觸發標準鬧鈴後,您會有幾秒鐘的時間完成工作,此時應用可能無法訪問網路 (例如,系統處於低耗電模式,或者應用被歸入某一待機群組)。如果您必須訪問網路,或者任務執行時間較久,請呼叫 WorkManager。每當喚醒鬧鐘被觸發後,裝置就會退出低電量模式並持有一個區域性喚醒鎖,而長時間持有喚醒鎖會嚴重影響裝置的續航時間。建議您通過 Google Play 管理中心提供的 Android Vitals 來監測應用是否存在過度喚醒的問題。
-
低耗電模式:
https://developer.android.google.cn/training/monitoring-device-state/doze-standby
-
喚醒:
https://developer.android.google.cn/topic/performance/vitals/wakeup
-
區域性喚醒鎖:
https://developer.android.google.cn/topic/performance/vitals/wakelock
-
Google Play 管理中心:
https://g.co/play/console
-
Android Vitals:
https://developer.android.google.cn/topic/performance/vitals/
總結:
合理的後臺執行策略可以幫助您開發出卓越的應用,在打造完美使用者體驗的同時,為裝置保駕 “續” 航。如果您想進一步瞭解後臺執行的相關訊息,請訪問 Android 開發者官網。
-
Android 開發者官網:
請注意:WorkManager 目前只發布了公共預覽版,您可以繼續使用 JobScheduler 作為替代方案,不過和 WorkManger 相比,JobScheduler 有更多的侷限。 JobScheduler 屬於 Android 框架的一部分,它僅在 API ≥ 21 的系統上可用;而 WorkManager 則支援 API 14 及更高版本。