Android省電的秘密之JobScheduler

JobScheduler是Android L版本新引入的API正蛙,JobScheduler,顧名思義塘幅,是用來調(diào)度工作昔案。工作被調(diào)度的條件包括網(wǎng)絡(luò)變化,充電插拔电媳,周期執(zhí)行等踏揣。使用場景包括wifi條件下數(shù)據(jù)下載上傳等等。谷歌為什么要引入這個新的API呢匾乓?是為了省電而制定的一種規(guī)范捞稿。想想如果每個開發(fā)者都利用這個API進行wifi網(wǎng)絡(luò)下數(shù)據(jù)上傳,數(shù)據(jù)上傳的操作將會被統(tǒng)一到同一個時間點,批量處理括享,這樣比許多應(yīng)用單獨喚醒要省電的多搂根。

下面展示一個小例子
主MainActivity
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 代表免費的網(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)該開啟一個新線程(因為JobService是跑在主線程的)娇斩,并且返回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ù)的增多辞做,延時會越長。舉個例子寡具,因為wifi斷開而執(zhí)行失敗的任務(wù)秤茅,在wifi連上后不會馬上執(zhí)行,延時一段時間才能執(zhí)行童叠。
延時時間=30s*失敗次數(shù)框喳。

下圖是JobScheduler在framework層的時序圖课幕,下一章將用adb指令直觀查看JobScheduler的情況,不容錯過五垮。有問題可以留言喲乍惊,大家一起探討!


JobScheduler內(nèi)部時序圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末放仗,一起剝皮案震驚了整個濱河市润绎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诞挨,老刑警劉巖莉撇,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惶傻,居然都是意外死亡棍郎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門银室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涂佃,“玉大人,你說我怎么就攤上這事粮揉⊙怖睿” “怎么了抚笔?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵扶认,是天一觀的道長。 經(jīng)常有香客問我殊橙,道長辐宾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任膨蛮,我火速辦了婚禮叠纹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敞葛。我一直安慰自己誉察,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布惹谐。 她就那樣靜靜地躺著持偏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氨肌。 梳的紋絲不亂的頭發(fā)上鸿秆,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音怎囚,去河邊找鬼卿叽。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的考婴。 我是一名探鬼主播贩虾,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沥阱!你這毒婦竟也來了整胃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤喳钟,失蹤者是張志新(化名)和其女友劉穎屁使,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奔则,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡蛮寂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了易茬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酬蹋。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抽莱,靈堂內(nèi)的尸體忽然破棺而出范抓,到底是詐尸還是另有隱情,我是刑警寧澤食铐,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布匕垫,位于F島的核電站,受9級特大地震影響虐呻,放射性物質(zhì)發(fā)生泄漏象泵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一斟叼、第九天 我趴在偏房一處隱蔽的房頂上張望偶惠。 院中可真熱鬧,春花似錦朗涩、人聲如沸忽孽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兄一。三九已至,卻和暖如春萤悴,著一層夾襖步出監(jiān)牢的瞬間瘾腰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工覆履, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹋盆,地道東北人费薄。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像栖雾,于是被迫代替她去往敵國和親楞抡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android Jobscheduler使用 Until android API 25 一析藕、Jobschedule...
    芥末末的沫閱讀 50,385評論 11 90
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理召廷,服務(wù)發(fā)現(xiàn),斷路器账胧,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 被問到啊哈哈哈竞慢,宛如一個智障的我為什么沒有想到!性能優(yōu)化肯定會省電啊啊啊其他的沒說治泥,這個怎么…… 憋說了筹煮,來來來,...
    卡路fly閱讀 2,511評論 0 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,082評論 25 707
  • 你總是捕風(fēng)捉影 你總是無病呻吟 你總是故作高深 你總是自作多情 你背井離鄉(xiāng) 只為尋找遠方 你眾叛親離 只為鶴立雞群...
    文藝調(diào)頻閱讀 756評論 21 20