Android性能模式篇之智能的工作計(jì)劃(譯)

2018-06-06 14:19 更新

Android官方文檔鏈接:Intelligent Job-Scheduling

譯者:Jack Wang 微博:汪海游龍

配圖

<!-- more -->

隨著需求和業(yè)務(wù)的發(fā)展,越來越多的apps需要去異步執(zhí)行各種各樣的任務(wù),有些任務(wù)是用戶去執(zhí)行的,而有些任務(wù)則是apps自身需要去執(zhí)行,這些任務(wù)的使用場(chǎng)景有如下示例:

  • 更新網(wǎng)絡(luò)資源
  • 下載信息
  • 更新后臺(tái)任務(wù)
  • 處理系統(tǒng)服務(wù)的回調(diào)

如何智能化的去處理這項(xiàng)工作,是至關(guān)重要的,如果處理方式得當(dāng)?shù)脑?,不僅可以提高你的應(yīng)用性能,還可以減輕系統(tǒng)的壓力,例如通過減少你的應(yīng)用耗電量,來達(dá)到省電的效果。

于是,針對(duì)這一需求,JobScheduler應(yīng)運(yùn)而生。

目前Android系統(tǒng)已經(jīng)提供了幾種APIs來讓你的app安排后臺(tái)任務(wù),但是我們建議優(yōu)先選擇JobScheduler ,因?yàn)?a rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" >JobScheduler API不僅可以選擇一個(gè)合適的時(shí)機(jī)去執(zhí)行任務(wù),提高app和系統(tǒng)的性能。.JobScheduler還具有高度的擴(kuò)展性和適用性。你可以通過它來執(zhí)行一個(gè)簡(jiǎn)單的任務(wù),如清除緩存,也可以通過它來執(zhí)行復(fù)雜的任務(wù),如同步你的數(shù)據(jù)庫(kù)到云端。

除了JobScheduler ,還有其他一些類似的APIs去幫助安排你的工作計(jì)劃,它們包括:

本篇文章簡(jiǎn)要介紹了JobScheduler和其他API,可以幫助你的應(yīng)用程序優(yōu)雅的去安排你的工作計(jì)劃。

Android Framework JobScheduler

JobScheduler是由Android系統(tǒng)框架所提供,它被用來執(zhí)行任務(wù)或者安排工作計(jì)劃,目前JobScheduler只能在Android 5.0以上的版本才可以使用,并且一直在不斷的完善中,尤其是,在最新的Android N版本中增加了一個(gè)新的功能,在ContentProvider 發(fā)生改變時(shí)觸發(fā)你的工作計(jì)劃。

由于JobScheduler是在Android系統(tǒng)框架內(nèi)實(shí)現(xiàn)的,所以當(dāng)apps選擇使用JobScheduler時(shí),它可以通過收集一切有利于安排工作計(jì)劃和執(zhí)行任務(wù)的有關(guān)信息,更好的去完成它的工作。這種方式的批量作業(yè)執(zhí)行允許設(shè)備進(jìn)入和停留在休眠狀態(tài)更長(zhǎng)的時(shí)間,保護(hù)電池壽命。

通過注冊(cè)jobs來使用JobScheduler,并指定它對(duì)網(wǎng)絡(luò)和時(shí)間的要求,然后Android系統(tǒng)會(huì)優(yōu)雅地安排工作在適當(dāng)?shù)臅r(shí)間執(zhí)行,同時(shí),它也將執(zhí)行必要的工作在遵循Doze and App Standby的限制前提下,另外,JobScheduler也提供了許多方法來定義工作的執(zhí)行情況。

如果你的應(yīng)用程序的目標(biāo)是Android 5(API Level 21)以上,我們建議您使用JobScheduler執(zhí)行后臺(tái)任務(wù)。關(guān)于JobScheduler的更多信息,見其API參考文檔。

AlarmManager

AlarmManager API是Android 系統(tǒng)框架提供的另一種選擇,用來安排你的工作計(jì)劃。它的使用場(chǎng)景,一般是app需要在一個(gè)特定的時(shí)間發(fā)布一個(gè)通知或在一個(gè)特定的時(shí)間內(nèi)發(fā)出一個(gè)指示信息。

如果你的需求僅僅是執(zhí)行在一個(gè)特定時(shí)間的任務(wù),而不考慮其他方面的話,你可以使用AlarmManager。JobScheduler則更加靈活,你可以指定執(zhí)行的條件,如設(shè)備空閑或者充電的時(shí)候。

AlarmManager并不遵循Doze and App Standby 的限制,它在運(yùn)行任務(wù)并沒有考慮Doze or App Standby模式。需要注意的是,應(yīng)用程序如果是運(yùn)行在Doze or App Standby模式下,是無法使用網(wǎng)絡(luò)應(yīng)用程序。

Firebase JobDispatcher

Firebase JobDispatcher是一個(gè)開源的庫(kù),它和系統(tǒng)框架的JobScheduler非常相似。不過值得一提的是,Firebase JobDispatcher可以兼容Android 5.0以下的版本。

Firebase JobDispatcher支持使用Google Play services的調(diào)度去執(zhí)行(運(yùn)行)的工作,但這個(gè)庫(kù)也允許您定義和使用其他的實(shí)現(xiàn):例如,你可能會(huì)決定使用JobScheduler或自定義。

如果你的應(yīng)用程序需要兼容Android 5.o以下的版本,我們建議你使用Firebase JobDispatcher。

關(guān)于Firebase JobDispatcher的更多信息,參考其文檔和源代碼。

GCM Network Manager

GCM Network ManagerAndroid提供一個(gè)可以兼容到5.0以下版本的JobScheduler。它具有JobScheduler所有的優(yōu)勢(shì),但是,它依賴于Google Play services,因?yàn)槭怯?strong>Google Play services負(fù)責(zé)所有工作計(jì)劃的安排和執(zhí)行,并達(dá)到省電的目的。

GCM Network ManagerFirebase JobDispatcher的較早版本。目前GCM Network Manager已經(jīng)停止更新,我們建議您使用Firebase JobDispatcher。

其他

除了上面所介紹的外,還有SyncAdapterServices,可以使您的應(yīng)用程序在特定條件下,更合理的去安排工作計(jì)劃和執(zhí)行任務(wù)。

SyncAdapter

SyncAdapter類是由系統(tǒng)框架所提供,它的作用是用來管理你的設(shè)備和服務(wù)器之前的同步任務(wù)。Sync adapters相對(duì)于以上的幾種APIs,有著更為復(fù)雜的實(shí)現(xiàn),因?yàn)樗竽阒辽偬峁?a rel="external nofollow" target="_blank" >authenticator和content provider的實(shí)現(xiàn)。因此,如果你只是簡(jiǎn)單的想在后臺(tái)同步數(shù)據(jù)到云端,你應(yīng)該使用JobScheduler、Firebase JobDispatcher,或者GCM Network Manager來代替。

如果你的需求更貼近于 SyncAdapter的使用場(chǎng)景,那么你應(yīng)該使用它。

Services

Services允許您在后臺(tái)運(yùn)行一段長(zhǎng)時(shí)間的操作。如果這個(gè)操作是需要與用戶交互的話,我們建議你將任務(wù)放在前臺(tái)的Services中,如播放音樂。另外,在某些使用場(chǎng)景下,我們建議你將Services綁定在用戶需要去使用的那個(gè)fragment 或者 activity中。

Services中,你應(yīng)該避免使用那些無限制時(shí)間和周期性的任務(wù),因?yàn)榧幢闼鼈儾]有執(zhí)行,也會(huì)去耗費(fèi)系統(tǒng)的資源。相應(yīng)的,針對(duì)這些任務(wù),您應(yīng)該使用本篇文章所介紹的其他解決方案,并提供與之對(duì)應(yīng)的生命周期管理。所以,針對(duì)這些特殊的任務(wù),Services并不是你良好的選擇方案。

注意

無論你采用的解決方案,請(qǐng)注意以下幾點(diǎn):

  • 考慮到網(wǎng)絡(luò)的復(fù)雜性,一些互聯(lián)網(wǎng)門戶網(wǎng)站,VPN,和代理可能會(huì)有網(wǎng)絡(luò)連接檢測(cè)失敗的問題。一個(gè)庫(kù)或一個(gè)接口可能會(huì)認(rèn)為網(wǎng)絡(luò)是可用的,但是您的服務(wù)可能無法訪問。所以,你需要合理的去處理失敗的情況,以及重新安排工作計(jì)劃的執(zhí)行。

  • 根據(jù)您分配的條件來運(yùn)行一個(gè)任務(wù),如在網(wǎng)絡(luò)正常連接的情況下,任務(wù)被觸發(fā)后,但是如果發(fā)生一個(gè)更改,使這些條件不再滿足。在這種情況下,你的操作可能會(huì)失敗,或者反復(fù)的去執(zhí)行。基于這個(gè)原因,你應(yīng)該在任務(wù)失敗的時(shí)候通知你的后臺(tái)任務(wù)邏輯,并避免對(duì)資源產(chǎn)生一些過度的使用。

  • 如果你使用的是AlarmManager ,在重新安排你的工作計(jì)劃執(zhí)行時(shí),需要避免產(chǎn)生一些不必要的沖突。如果你使用的是JobScheduler ,?GCM Network Manager,?Firebase JobDispatcher, 或者 sync adapters,它們則已經(jīng)自動(dòng)處理好這個(gè)問題。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)