高效管理 Android 前臺服務

Android_開發者發表於2019-01-17

高效管理 Android 前臺服務

作者 / Keith Smyth

本文為 Android 電量管理系列連載的第四篇,希望可以為各位開發者提供裝置續航方面的戰略洞見和實踐指南。

Android 程式管理機制

作為一款移動端作業系統,Android 在設計之初就考慮到了諸如記憶體和電量一類的資源限制問題。因此,系統在記憶體吃緊的情況下會關閉部分程式,以此來為優先順序更高的任務騰出執行空間。那麼系統是如何評判優先順序高低的呢?判斷標準其實很簡單,關鍵就在於應用程式對使用者有多重要。Android 將程式分為以下幾類,按重要性的高低做降序排列,程式排名越靠前,被回收的機率就越低。

高效管理 Android 前臺服務

前臺服務

應用產生快取很正常: 每個開發者應該認識到,共享裝置資源是生命週期管理的一部分,這樣才有助於營造健康的 Android 生態環境。當電池電量耗盡時,所有應用都無法繼續使用,而導致耗電異常的應用則會面臨解除安裝風險。

不過在特定情況下,開發者的確需要把應用從後臺轉到前臺執行。當應用所執行的任務同時滿足以下條件時,您可以為其建立前臺服務,直至任務執行結束: (1) 需要立即執行; (2) 重要 (必須完成); (3) 使用者可感知 (大部分情況下由使用者主動發起); (4) 有明確的起始時間和結束時間。

為了幫助您更好地建立和管理前臺服務,我們特別為總結了以下 3 個操作要點:

  1. 適用於所有 API 等級: 應用建立服務時,必須顯示級別至少為 PRIORITY_LOW 的常駐通知 (persistent notification)。

  2. 若應用的目標 API 等級高於 26,您還需要將通知渠道的級別至少設定為IMPORTANCE_LOW。使用者可以點選通知來取消任務,且取消操作可與 action 繫結,例如,當使用者停止播放曲目後,回放服務也會一同停止。

  3. 通知標題和描述必須準確體現前臺服務正在執行的操作。

如果您想了解有關前臺服務的更多資訊,包括最近幾個版本 Android 平臺內的相關重要更新,請參閱《在前臺執行服務》。

前臺服務典型用例

前臺服務的典型用例包括播放音樂、完成購買交易、高精度地理位置追蹤 (健身應用) 以及感應器資料錄入 (監測使用者的睡眠狀態)。這些工作均由使用者主動發起,需要立刻執行,並且具備明確的起始時間和結束時間,而且允許使用者隨時取消操作。

此外,您還可以為需要立即執行的關鍵任務 (如儲存圖片、傳送訊息、處理交易等) 建立前臺服務,那麼即使使用者退出當前應用並開啟新的應用,這些任務的執行也不會受到影響。在裝置記憶體不足的情況下,系統可能會強行停止還在執行的前一個應用,從而導致資料丟失或其它意外事件。優秀的應用應當具備實時監測自身程式的能力,並在程式轉入後臺後,將用時較短的關鍵任務切換至前臺完成。

如果應用需要一直在前臺執行服務,那麼僅僅建立前臺服務是不夠的,建議您從以下用例中並選擇最適方案,在滿足應用需求的同時為裝置節省電量。

其它方案

不建議您通過前臺服務實現被動定位追蹤,如果使用者已經允許您的應用進行地理位置追蹤,請呼叫 FusedLocationProvider API 獲取位置更新,並注意設定合適的獲取頻率 (切勿太頻繁) ;在宿主裝置進入或離開特定區域時,請通過 geofencing API 向使用者傳送通知。 更多技術細節,請閱讀《延長裝置續航時間之位置管理優化》。

請通過 CompanionDeviceManager 完成藍芽裝置配對。如果應用需要重新連線至裝置,請呼叫 BluetoothLeScanner 中接受 PendingIntent 引數的 startScan 方法,當過濾條件滿足時會被觸發。

如果任務必須完成,但允許推遲執行,請使用 WorkManager 或者 JobScheduler 在系統層面上實現最佳的任務排程和時間安排。如果任務需要立即開始,但是一旦使用者退出應用,任務也會一同停止,推薦您使用 ThreadPoolsKotlin Coroutines

下載管理器 (DownloadManager) 可以幫助您在後臺處理耗時較長的下載任務,而且它支援斷點續傳,即使在網路連線斷開或裝置重啟的情況下,管理器依舊可以繼續上次下載。

結語

如果運用得當,應用便可以通過前臺服務這條 “溝通渠道”, 告知系統自己當前正在執行對使用者而言十分重要的任務。正確的工具決策是通向一流使用者體驗的最佳途徑。歡迎您在社群內踴躍發言並並向我們積極反饋,攜手廣大開發者共同制定更優決策,將使用者放在第一位!

高效管理 Android 前臺服務

 點選這裡瞭解更多 P&E 相關產品內容


相關文章