Android省電的秘密之JobScheduler
JobScheduler是Android L版本新引入的API,JobScheduler,顧名思義,是用來(lái)調(diào)度工作。工作被調(diào)度的條件包括網(wǎng)絡(luò)變化,充電插拔,周期執(zhí)行等。使用場(chǎng)景包括wifi條件下數(shù)據(jù)下載上傳等等。谷歌為什么要引入這個(gè)新的API呢?是為了省電而制定的一種規(guī)范。想想如果每個(gè)開(kāi)發(fā)者都利用這個(gè)API進(jìn)行wifi網(wǎng)絡(luò)下數(shù)據(jù)上傳,數(shù)據(jù)上傳的操作將會(huì)被統(tǒng)一到同一個(gè)時(shí)間點(diǎn),批量處理,這樣比許多應(yīng)用單獨(dú)喚醒要省電的多。
下面展示一個(gè)小例子
主MainActivity
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 代表免費(fèi)的網(wǎng)絡(luò),通常就是指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());
}
}
需要被調(diào)度的Job
當(dāng)wifi可用時(shí),這個(gè)DemoService 就會(huì)執(zhí)行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函數(shù)常常有兩種場(chǎng)景
1.不耗時(shí)的操作,這時(shí)你應(yīng)該返回false
2.耗時(shí)的操作例如數(shù)據(jù)下載等,這是你應(yīng)該開(kāi)啟一個(gè)新線程(因?yàn)镴obService是跑在主線程的),并且返回true
如果調(diào)度是任務(wù)執(zhí)行失敗了,怎么辦?
任務(wù)失敗的情況有很多,例如下載失敗了,例如下載過(guò)程wifi斷掉了。
沒(méi)問(wèn)題,google提供了方便的重新調(diào)度的方法。
例如如果下載過(guò)程中,wifi斷掉了,JobService會(huì)回調(diào)onStopJob函數(shù),這是只需要把函數(shù)的返回值設(shè)置為true就可以了。當(dāng)wifi重新連接后,JobService會(huì)重新回調(diào)onStartJob函數(shù)。
而如果下載失敗了,例如上面的例子中的AsyncTask執(zhí)行失敗,怎么辦呢?我們只需要在AsyncTask的onPostExecute中執(zhí)行jobFinished(mJobParameters, true),這里的true代表任務(wù)要在wifi條件重新滿足情況下重新調(diào)度。經(jīng)典的寫(xiě)法如下。
開(kāi)始調(diào)度
@Override
public boolean onStartJob(final JobParameters params) {
mDownloadArtworkTask = new DownloadArtworkTask(this) {
@Override
protected void onPostExecute(Boolean success) {
jobFinished(params, !success);
}
};
mDownloadArtworkTask.execute();
return true;
}
停止調(diào)度
@Override
public boolean onStopJob(final JobParameters params) {
if (mDownloadArtworkTask != null) {
mDownloadArtworkTask.cancel(true);
}
return true;
}
如果調(diào)度的任務(wù)老是執(zhí)行失敗,怎么辦?
為了省電的考慮,失敗的任務(wù)在執(zhí)行條件滿足的情況下,要延時(shí)一段時(shí)間才能執(zhí)行。而且隨著失敗次數(shù)的增多,延時(shí)會(huì)越長(zhǎng)。舉個(gè)例子,因?yàn)閣ifi斷開(kāi)而執(zhí)行失敗的任務(wù),在wifi連上后不會(huì)馬上執(zhí)行,延時(shí)一段時(shí)間才能執(zhí)行。
延時(shí)時(shí)間=30s*失敗次數(shù)。
下圖是JobScheduler在framework層的時(shí)序圖,下一章將用adb指令直觀查看JobScheduler的情況,不容錯(cuò)過(guò)。有問(wèn)題可以留言喲,大家一起探討!

JobScheduler內(nèi)部時(shí)序圖
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
快速關(guān)閉android studio的自動(dòng)保存功能教程
這篇文章主要介紹了快速關(guān)閉android studio的自動(dòng)保存功能教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Android自定義滑動(dòng)刪除效果的實(shí)現(xiàn)代碼
這篇文章將從現(xiàn)有 Android 滑動(dòng)刪除的痛點(diǎn),到搭建好一個(gè)基本的框架,到最終提供一份完整的 Demo為止,爭(zhēng)取為讀者提供最大的可定制化,需要的朋友可以參考下2018-03-03
Android后臺(tái)定時(shí)提醒功能實(shí)現(xiàn)
這篇文章主要介紹了Android后臺(tái)定時(shí)提醒功能,針對(duì)Service,AlarmManager的使用進(jìn)行詳細(xì)闡述,感興趣的小伙伴們可以參考一下2016-01-01
Android實(shí)現(xiàn)輪播圖無(wú)限循環(huán)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)輪播圖無(wú)限循環(huán)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android仿知乎懸浮功能按鈕FloatingActionButton效果
前段時(shí)間在看屬性動(dòng)畫(huà),恰巧這個(gè)按鈕的效果可以用屬性動(dòng)畫(huà)實(shí)現(xiàn),下面通過(guò)本文給大家分享adroid仿知乎懸浮功能按鈕FloatingActionButton效果,需要的朋友參考下吧2017-04-04
android基本控件ToggleButton&Switch使用指南
本文給大家匯總介紹了android的2個(gè)基本控件ToggleButton和Switch的使用方法,非常的詳細(xì),有需要的小伙伴可以參考下。2016-01-01
Android自定義實(shí)現(xiàn)側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android 6.0動(dòng)態(tài)權(quán)限及跳轉(zhuǎn)GPS設(shè)置界面的方法
今天小編就為大家分享一篇Android 6.0動(dòng)態(tài)權(quán)限及跳轉(zhuǎn)GPS設(shè)置界面的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Android實(shí)現(xiàn)后臺(tái)服務(wù)拍照功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)后臺(tái)服務(wù)拍照功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

