Android省電的秘密之JobScheduler
JobScheduler是Android L版本新引入的API,JobScheduler,顧名思義,是用來調(diào)度工作。工作被調(diào)度的條件包括網(wǎng)絡(luò)變化,充電插拔,周期執(zhí)行等。使用場景包括wifi條件下數(shù)據(jù)下載上傳等等。谷歌為什么要引入這個新的API呢?是為了省電而制定的一種規(guī)范。想想如果每個開發(fā)者都利用這個API進(jìn)行wifi網(wǎng)絡(luò)下數(shù)據(jù)上傳,數(shù)據(jù)上傳的操作將會被統(tǒng)一到同一個時間點(diǎn),批量處理,這樣比許多應(yīng)用單獨(dú)喚醒要省電的多。
下面展示一個小例子
主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可用時,這個DemoService 就會執(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ù)常常有兩種場景
1.不耗時的操作,這時你應(yīng)該返回false
2.耗時的操作例如數(shù)據(jù)下載等,這是你應(yīng)該開啟一個新線程(因?yàn)镴obService是跑在主線程的),并且返回true
如果調(diào)度是任務(wù)執(zhí)行失敗了,怎么辦?
任務(wù)失敗的情況有很多,例如下載失敗了,例如下載過程wifi斷掉了。
沒問題,google提供了方便的重新調(diào)度的方法。
例如如果下載過程中,wifi斷掉了,JobService會回調(diào)onStopJob函數(shù),這是只需要把函數(shù)的返回值設(shè)置為true就可以了。當(dāng)wifi重新連接后,JobService會重新回調(diào)onStartJob函數(shù)。
而如果下載失敗了,例如上面的例子中的AsyncTask執(zhí)行失敗,怎么辦呢?我們只需要在AsyncTask的onPostExecute中執(zhí)行jobFinished(mJobParameters, true),這里的true代表任務(wù)要在wifi條件重新滿足情況下重新調(diào)度。經(jīng)典的寫法如下。
開始調(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í)行條件滿足的情況下,要延時一段時間才能執(zhí)行。而且隨著失敗次數(shù)的增多,延時會越長。舉個例子,因?yàn)閣ifi斷開而執(zhí)行失敗的任務(wù),在wifi連上后不會馬上執(zhí)行,延時一段時間才能執(zhí)行。
延時時間=30s*失敗次數(shù)。
下圖是JobScheduler在framework層的時序圖,下一章將用adb指令直觀查看JobScheduler的情況,不容錯過。有問題可以留言喲,大家一起探討!
JobScheduler內(nèi)部時序圖
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Android組件創(chuàng)建DrawerLayout導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android組件創(chuàng)建DrawerLayout導(dǎo)航的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Android Glide圖片加載(加載監(jiān)聽、加載動畫)
這篇文章主要為大家詳細(xì)介紹了Android Glide圖片加載的具體實(shí)現(xiàn)方法,包括加載監(jiān)聽、加載動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11全面解析Android中對EditText輸入實(shí)現(xiàn)監(jiān)聽的方法
這篇文章主要介紹了Android中對EditText輸入實(shí)現(xiàn)監(jiān)聽的方法,包括一個仿iOS的帶清除功能的ClearEditText輸入框控件的詳細(xì)使用介紹,需要的朋友可以參考下2016-04-04Android網(wǎng)絡(luò)連接判斷與相關(guān)處理
這篇文章主要為大家詳細(xì)介紹了Android網(wǎng)絡(luò)連接判斷操作,幫助大家判斷WIFI網(wǎng)絡(luò)是否可用,判斷MOBILE網(wǎng)絡(luò)是否可用,感興趣的小伙伴們可以參考一下2016-08-08Android Doze模式下Alarm定時任務(wù)實(shí)現(xiàn)流程詳解
這篇文章主要介紹了Android Doze模式下Alarm定時任務(wù)實(shí)現(xiàn),Android的定時任務(wù)有兩種,一種是JavaAPI提供的Timer類,另一種就是使用Android的Alarm機(jī)制2022-11-11Android編程開發(fā)之打開文件的Intent及使用方法
這篇文章主要介紹了Android編程開發(fā)之打開文件的Intent及使用方法,已實(shí)例形式分析了Android打開文件Intent的相關(guān)布局及功能實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Android使用GridView實(shí)現(xiàn)表格分割線效果
這篇文章主要為大家詳細(xì)介紹了Android使用GridView實(shí)現(xiàn)表格分割線效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07Android客戶端實(shí)現(xiàn)注冊、登錄詳解(2)
這篇文章主要為大家詳細(xì)介紹了Android客戶端實(shí)現(xiàn)注冊、登錄代碼第二篇,App與服務(wù)器的交互實(shí)現(xiàn)登錄和自動登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11