前提:5.0以上,守護進程自拉活的模式已經(jīng)不可用。同時由于forceStopPackage會禁用Broadcast、Alarm,因此應(yīng)用在5.0以上的自拉活成為一個需要面臨的新課題。
目前發(fā)現(xiàn)了兩種方法可以做到在5.0以上實現(xiàn)應(yīng)用的自拉活:
NotificationListenerService:缺點:需要用戶打開開關(guān);優(yōu)點:實時性好,應(yīng)用被殺馬上拉起。
JobScheduler:下文將分析JobScheduler的實現(xiàn)原理、使用方法和優(yōu)缺點。
JobScheduler主要API介紹:
JobScheduler:API 21以上提供的系統(tǒng)服務(wù)接口,是系統(tǒng)服務(wù)JobSchedulerService的客戶端代理
http://developer.android.com/reference/android/app/job/JobScheduler.html
http://developer.android.com/samples/JobScheduler/index.html
獲?。篶ontext.getSystemService(Context.JOB_SCHEDULER_SERVICE);

JobInfo:應(yīng)用程序向JobSchedulerService發(fā)出任務(wù)請求的描述類,使用JobInfo.Builder構(gòu)建。
http://developer.android.com/reference/android/app/job/JobInfo.html
http://developer.android.com/reference/android/app/job/JobInfo.Builder.html
JobInfo.Builder主要API
設(shè)置為開機啟動的任務(wù)

設(shè)置任務(wù)執(zhí)行周期

設(shè)置重試策略

JobScheduler對于應(yīng)用自拉活的作用和方法:
通過JobScheduler將JobService注冊到系統(tǒng)中,系統(tǒng)在條件滿足時,主動bind到JobService,完成拉活。注冊的信息不會因forceStop而被清除。
為了起到及時守護的效果,目前設(shè)置了周期為3秒:每3秒系統(tǒng)就會bind/unbind一次,為了防止JobService重新實例化,在App啟動時,通過startService方法先拉起JobService,并使其STICKY。
優(yōu)點:API21以上可用,測試6.0的Nexus 5x可用,與守護進程方式一起覆蓋了4.0—6.0的機型。
缺點:受到Doze、系統(tǒng)休眠限制
Demo:https://github.com/ziruiwang/DefendService.git?
JobScheduler在系統(tǒng)中的主要結(jié)構(gòu)
