編輯:安卓省電與加速
JobScheduler是Android L版本新引入的API,JobScheduler,顧名思義,是用來調度工作。工作被調度的條件包括網絡變化,充電插拔,周期執行等。使用場景包括wifi條件下數據下載上傳等等。谷歌為什麼要引入這個新的API呢?是為了省電而制定的一種規范。想想如果每個開發者都利用這個API進行wifi網絡下數據上傳,數據上傳的操作將會被統一到同一個時間點,批量處理,這樣比許多應用單獨喚醒要省電的多。
下面展示一個小例子
主MainActivity
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 代表免費的網絡,通常就是指wifi了
public class MainActivity extends Activity {
JobScheduler js;
JobInfo.Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
js=(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
builder=new Builder(1, new ComponentName(this, DemoService.class));
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
js.schedule(builder.build());
}
}
需要被調度的Job
當wifi可用時,這個DemoService 就會執行onStartJob
public class DemoService extends JobService{
@Override
public boolean onStartJob(JobParameters params) {
// TODO Auto-generated method stub
final JobParameters mJobParameters=params;
AsyncTask<Void, Void, Void> mTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
Toast.makeText(wenfengService.this, "hello", 1000).show();
jobFinished(mJobParameters, true);
super.onPostExecute(result);
}
};
mTask.execute();
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
// TODO Auto-generated method stub
Toast.makeText(this, "bye", 1000).show();
return true;
}
}
清單
<service android:name=".DemoService " android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>

onStartJob.png
onStartJob函數常常有兩種場景
1.不耗時的操作,這時你應該返回false
2.耗時的操作例如數據下載等,這是你應該開啟一個新線程(因為JobService是跑在主線程的),並且返回true
如果調度是任務執行失敗了,怎麼辦?
任務失敗的情況有很多,例如下載失敗了,例如下載過程wifi斷掉了。
沒問題,google提供了方便的重新調度的方法。
例如如果下載過程中,wifi斷掉了,JobService會回調onStopJob函數,這是只需要把函數的返回值設置為true就可以了。當wifi重新連接後,JobService會重新回調onStartJob函數。
而如果下載失敗了,例如上面的例子中的AsyncTask執行失敗,怎麼辦呢?我們只需要在AsyncTask的onPostExecute中執行jobFinished(mJobParameters, true),這裡的true代表任務要在wifi條件重新滿足情況下重新調度。經典的寫法如下。
開始調度
@Override
public boolean onStartJob(final JobParameters params) {
mDownloadArtworkTask = new DownloadArtworkTask(this) {
@Override
protected void onPostExecute(Boolean success) {
jobFinished(params, !success);
}
};
mDownloadArtworkTask.execute();
return true;
}
停止調度
@Override
public boolean onStopJob(final JobParameters params) {
if (mDownloadArtworkTask != null) {
mDownloadArtworkTask.cancel(true);
}
return true;
}
如果調度的任務老是執行失敗,怎麼辦?
為了省電的考慮,失敗的任務在執行條件滿足的情況下,要延時一段時間才能執行。而且隨著失敗次數的增多,延時會越長。舉個例子,因為wifi斷開而執行失敗的任務,在wifi連上後不會馬上執行,延時一段時間才能執行。
延時時間=30s*失敗次數。
下圖是JobScheduler在framework層的時序圖,下一章將用adb指令直觀查看JobScheduler的情況,不容錯過。有問題可以留言喲,大家一起探討!

JobScheduler內部時序圖
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持本站!
擺脫手機吊瓶 因為我有省電大師
如果小編將充電寶比喻成吊瓶,而一手提手機一手提充電寶是否更像打吊針呢?如今的手機電池從原來的1000多毫安提升至如今的3000毫安,手機的使用時間也有所改善,基本上能達到
Android中GPU硬件加速控制及其在2D圖形繪制上的局限
圖形的渲染可分為兩種:軟件渲染和硬件渲染。軟件渲染是靠CPU計算各種坐標並繪制,主要是占用內存;硬件渲染是靠GPU,主要占用顯存,一般的3D圖形程序(OpenGL、Dir
使用刷機精靈卸載定制機型預裝應用、加速手機系統
越來越多的用戶選擇安卓手機的同時,發現很多手機廠商把自己的應用強行預裝到手機裡進行宣傳,尤其是在手機市場占領了一席之地的合約機。由於內置應用大多無法直接刪除,大部分用戶不
如何延長續航時間 淺談Android手機的省電機制
Android手機的續航能力為何普遍偏低,如今各大手機品牌又有哪些“補救手段”?為了很多Android手機在開啟節能模式後卻收不到微