Introduction Job Sceduler 是一種高效的背景作業,能在一定程度上提高電池的使用壽命,同時也能給開發者節省開發的時間。
在Android 開發中,你可能會遇到,需要在某個時間點或滿足某個條件時,才執行特定的任務。 例如:當設備連上Wi-Fi或接上電源的時候,或是每過15分鐘,定期上傳數據資料,在以前我們可能考慮過使用 Handlers 延遲上傳,但萬一用戶或系統關閉他們的應用程式呢?這時你可能會考慮使用AlarmManager ,前提是在用戶沒有關機過的狀態下,才能正常運行。另外,我們還沒把網路狀態改變的情況(斷線)考慮進去,這時你可能需要註冊一個廣播,在網路恢復時進行額外的邏輯處理,以確保你的程序正常的執行。
以上種種情形,真的是會讓開發者苦惱許久,幸運的是現在Google都幫你準備好了,Job Sceduler已經與新的系統緊密的結合,你只需要事先設定好執行的條件,條件的判斷就交給系統去處理,這你支新的API只會在你滿足條件時執行。
看看我們實際上如何做到這一點
1.創建Job Service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class JobSchedulerService extends JobService { @Override public boolean onStartJob(JobParameters params) { //返回true ,表示該工作耗時,需要執行結束時手動調用jobFinished(),來銷毀任務 //返回false ,代表任務處理不需要很長的時間,在resurn時已經處理結束 return false ; } @Override public boolean onStopJob(JobParameters params) { //只有在 onStartJob() 返回ture時,手動調用 jobFinished() 後才會執行此方法 //返回false 來銷毀此工作 return false ; } }
2.創建一個JobScheduler對象 1 2 3 //job id 用以區別任務 int JOB_ID = 0 JobInfo.Builder jobBuilder = JobInfo.Builder(JOB_ID, new ComponentName(getPackageName(), JobSchedulerService.class.getName()));
JobInfo.Builder 還允許你設定不同的條件,任務只會在符合設置條件時執行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //設置任務延遲執行的時間,單位毫秒 jobBuilder.setMinimumLatency(long minLatencyMillis) //設置任務最後延遲時間,如果時間到了其他條件還未滿足,任務也會啟動 jobBuilder.setOverrideDeadline(long maxExecutionDelayMillis) //設置在有網路連線的狀態下執行,預設是NETWORK_TYPE_NONE,意即不需要網路 jobBuilder.setRequiredNetworkType(int networkType); //是否在充電時執行,並非充電馬上觸發,只有在電量健康的時候(>15%),才會觸發 //jobBuilder.setRequiresCharging(boolean requiresCharging) //設置是否在設備重啟後,要繼續執行 jobBuilder.setPersisted(boolean isPersisted) //設置任務運行的週期,與setMinimumLatency()和setOverrideDeadline()不兼容,同時設置會引發異常 jobBuilder.setPeriodic(long time) //是否在空閒的時候執行,只有當用戶一段時間沒有使用設備時,才會觸發 jobBuilder.setRequiresDeviceIdle(boolean requiresDeviceIdle)
3.構建一個JobIndo對象,並將它發送到JobScheduler中 1 2 JobScheduler mJobScheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE); mJobScheduler.schedule(jobBuilder.build())
在JobScheduler.schedule(JobInfo jobInfo)中,會返回一個int值,代表此任務是否安排成功,如果返回值小於0,代表任務失敗,反之則會返回該任務的id 1 2 3 if ((mJobScheduler.schedule(jobBuilder.build())) <= 0) { Log.i(TAG, " something goes wrong" ) }
參考網站:Android JobScheduler Android Intelligent Job-Scheduling Youtube Android Developer