Android性能模式篇之智能的工作計劃(譯)
隨著需求和業務的發展,越來越多的apps需要去異步執行各種各樣的任務,有些任務是用戶去執行的,而有些任務則是apps自身需要去執行,這些任務的使用場景有如下示例:
- 更新網絡資源
- 下載信息
- 更新后臺任務
- 處理系統服務的回調
如何智能化的去處理這項工作,是至關重要的,如果處理方式得當的話,不僅可以提高你的應用性能,還可以減輕系統的壓力,例如通過減少你的應用耗電量,來達到省電的效果。
于是,針對這一需求,JobScheduler應運而生。
目前Android系統已經提供了幾種APIs來讓你的app安排后臺任務,但是我們建議優先選擇JobScheduler ,因為JobScheduler API不僅可以選擇一個合適的時機去執行任務,提高app和系統的性能。.JobScheduler還具有高度的擴展性和適用性。你可以通過它來執行一個簡單的任務,如清除緩存,也可以通過它來執行復雜的任務,如同步你的數據庫到云端。
除了JobScheduler ,還有其他一些類似的APIs去幫助安排你的工作計劃,它們包括:
本篇文章簡要介紹了JobScheduler和其他API,可以幫助你的應用程序優雅的去安排你的工作計劃。
Android Framework JobScheduler
JobScheduler是由Android系統框架所提供,它被用來執行任務或者安排工作計劃,目前JobScheduler只能在Android 5.0以上的版本才可以使用,并且一直在不斷的完善中,尤其是,在最新的Android N版本中增加了一個新的功能,在ContentProvider
發生改變時觸發你的工作計劃。
由于JobScheduler是在Android系統框架內實現的,所以當apps選擇使用JobScheduler時,它可以通過收集一切有利于安排工作計劃和執行任務的有關信息,更好的去完成它的工作。這種方式的批量作業執行允許設備進入和停留在休眠狀態更長的時間,保護電池壽命。
通過注冊jobs
來使用JobScheduler,并指定它對網絡和時間的要求,然后Android系統會優雅地安排工作在適當的時間執行,同時,它也將執行必要的工作在遵循Doze and App Standby的限制前提下,另外,JobScheduler也提供了許多方法來定義工作的執行情況。
如果你的應用程序的目標是Android 5(API Level 21)以上,我們建議您使用JobScheduler執行后臺任務。關于JobScheduler的更多信息,見其API參考文檔。
AlarmManager
AlarmManager API是Android 系統框架提供的另一種選擇,用來安排你的工作計劃。它的使用場景,一般是app需要在一個特定的時間發布一個通知或在一個特定的時間內發出一個指示信息。
如果你的需求僅僅是執行在一個特定時間的任務,而不考慮其他方面的話,你可以使用AlarmManager。JobScheduler則更加靈活,你可以指定執行的條件,如設備空閑或者充電的時候。
AlarmManager并不遵循Doze and App Standby 的限制,它在運行任務并沒有考慮Doze or App Standby模式。需要注意的是,應用程序如果是運行在Doze or App Standby模式下,是無法使用網絡應用程序。
Firebase JobDispatcher
Firebase JobDispatcher是一個開源的庫,它和系統框架的JobScheduler非常相似。不過值得一提的是,Firebase JobDispatcher可以兼容Android 5.0以下的版本。
Firebase JobDispatcher支持使用Google Play services的調度去執行(運行)的工作,但這個庫也允許您定義和使用其他的實現:例如,你可能會決定使用JobScheduler或自定義。
如果你的應用程序需要兼容Android 5.o以下的版本,我們建議你使用Firebase JobDispatcher。
關于Firebase JobDispatcher的更多信息,參考其文檔和源代碼。
GCM Network Manager
GCM Network Manager是Android提供一個可以兼容到5.0以下版本的JobScheduler。它具有JobScheduler所有的優勢,但是,它依賴于Google Play services,因為是由Google Play services負責所有工作計劃的安排和執行,并達到省電的目的。
GCM Network Manager是Firebase JobDispatcher的較早版本。目前GCM Network Manager已經停止更新,我們建議您使用Firebase JobDispatcher。
其他
除了上面所介紹的外,還有SyncAdapter和Services,可以使您的應用程序在特定條件下,更合理的去安排工作計劃和執行任務。
SyncAdapter
SyncAdapter類是由系統框架所提供,它的作用是用來管理你的設備和服務器之前的同步任務。Sync adapters相對于以上的幾種APIs,有著更為復雜的實現,因為它要求你至少提供authenticator和content provider的實現。因此,如果你只是簡單的想在后臺同步數據到云端,你應該使用JobScheduler、Firebase JobDispatcher,或者GCM Network Manager來代替。
如果你的需求更貼近于 SyncAdapter的使用場景,那么你應該使用它。
Services
Services允許您在后臺運行一段長時間的操作。如果這個操作是需要與用戶交互的話,我們建議你將任務放在前臺的Services中,如播放音樂。另外,在某些使用場景下,我們建議你將Services綁定在用戶需要去使用的那個fragment
或者 activity
中。
在Services中,你應該避免使用那些無限制時間和周期性的任務,因為即便它們并沒有執行,也會去耗費系統的資源。相應的,針對這些任務,您應該使用本篇文章所介紹的其他解決方案,并提供與之對應的生命周期管理。所以,針對這些特殊的任務,Services并不是你良好的選擇方案。
注意
無論你采用的解決方案,請注意以下幾點:
-
考慮到網絡的復雜性,一些互聯網門戶網站,V*N,和代理可能會有網絡連接檢測失敗的問題。一個庫或一個接口可能會認為網絡是可用的,但是您的服務可能無法訪問。所以,你需要合理的去處理失敗的情況,以及重新安排工作計劃的執行。
-
根據您分配的條件來運行一個任務,如在網絡正常連接的情況下,任務被觸發后,但是如果發生一個更改,使這些條件不再滿足。在這種情況下,你的操作可能會失敗,或者反復的去執行。基于這個原因,你應該在任務失敗的時候通知你的后臺任務邏輯,并避免對資源產生一些過度的使用。
-
如果你使用的是AlarmManager ,在重新安排你的工作計劃執行時,需要避免產生一些不必要的沖突。如果你使用的是JobScheduler
, GCM Network Manager, Firebase JobDispatcher, 或者 sync adapters,它們則已經自動處理好這個問題。
來自:http://hlong.xyz/2016/07/28/Android%E6%80%A7%E8%83%BD%E6%A8%A1%E5%BC%8F%E7%AF%87%E4%B9%8B%E6%99%BA%E8%83%BD%E7%9A%84%E5%B7%A5%E4%BD%9C%E8%AE%A1%E5%88%92%28%E8%AF%91%29/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io