app 耗電優化之三 使用JobSchedule對任務進行合理排期


JobSchedule 是Android5.0之后添加進去的,之前的版本沒有。
JobSchedule 原理是一種將任務安排在恰當的實際進行操作一種方案機制。具體提供了那些可選的時機,如下:
1 在可用網絡下執行。在7.0 之前,應用可以通過監聽網絡變化來執行任務,當然了前提是應用必須存活。到7.0之后這類API已經失效,但是JobSchedule機制提供了網絡變化的監聽。進一步可以在網絡變化的情況下執行某些操作。例如在wifi環境下執行下載任務等。
2 設備在充電或者空閑時執行一些任務。
3 設定執行的時間,這個和其他的條件(1,2)一起使用。
具體的實現如下:
1 任務排期

    final JobScheduler scheduler = context.getSystemService(JobScheduler.class);
    //或者
    final JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE );
    //如果當前的jobId已經被安排了則下取消該安排
    final int jobId = (int) info.mId;
    scheduler.cancel(jobId);
    //構建JobInfo  jobId 為jobID。DownloadJobService 為Job接受的Service,該Service必須繼承JobService
    final JobInfo.Builder builder = new JobInfo.Builder(jobId,new ComponentName(context, DownloadJobService.class));
    //設置設備重啟是執行此任務。前提是需要擁有RECEIVE_BOOT_COMPLETED  權限
    builder.setPriority(JobInfo.PRIORITY_FOREGROUND_APP);
    //這個設置並不能設置成為前台進程。通知還需要應用自己發。此外該設置會忽略該任務的網絡限制。
    builder.setFlags(JobInfo.FLAG_WILL_BE_FOREGROUND);
    //設置任務延遲執行時間,不可與setPeriodic(long time)同時使用
    builder.setMinimumLatency(time);
    //設置設備執行的網絡條件JobInfo.NETWORK_TYPE_UNMETERED 不計量網絡(wifi),JobInfo.NETWORK_TYPE_NOT_ROAMING 非漫游網絡, NETWORK_TYPE_ANY任何網絡
    //JobInfo.NETWORK_TYPE_NONE 無論是否有網絡都執行
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
    //設置在設備充電時執行
    builder.setRequiresCharging(true);
    //設置在設備空閑時間執行
    builder.setRequiresDeviceIdle(true);
    //循環沒5秒執行一次
    builder.setPeriodic(5000);
    //約定的時間內的條件都沒有被觸發是5秒以后開始觸發
    builder.setOverrideDeadline(5000);
    //生成Job
    JobInfo job = builder.build();
    //安排Job,該方法有返回值JobScheduler.RESULT_SUCCESS 表示安排成功,JobScheduler.RESULT_FAILURE 安排失敗
    scheduler.schedule(job)
    //安排Job, packageName 表示那個應用安排的Job(耗電記這個應用的)。 userId表示誰安排的Job
    scheduler.scheduleAsPackage(builder.build(), packageName, UserHandle.myUserId(), TAG);

2 處理任務。
 當任務安排下去,應該會被記錄在JobScheduler服務里面。當條件滿足時,處理job對應的JobService會被啟動,否則。。。
 首先定義JobService

<service
        android:name=".DownloadJobService"
        android:exported="true"  //這個地方必須是True,否則外界的應用無法啟動該JobService
        android:permission="android.permission.BIND_JOB_SERVICE" //必須定義這個權限,你懂得
    />
public class DownloadJobService extends JobService {
        //開始執行Job接口。(必須實現)如果返回false則表示這個Job已經被執行完畢。如果true則表示這個Job正在被執行。
        public boolean onStartJob(JobParameters params) {
            final int id = params.getJobId();
            ....開始執行Job
            
            1 對於一個瞬間能夠完成的任務,此處可以return false. 
            2 如果是耗時任務,則需要在異步線程中執行,並且返回true。此外
            myHandler.removeMessages(id);
            myHandler.sendEmptyMessage(id);
            執行完后不要忘記執行jobFinished
        }
        
        //Job執行停止,必須實現 ,當接收到任務取消時,如果該任務沒有被結束,則執行該方法,否則不執行。
        public boolean onStopJob(JobParameters params) {
            //當然此處可以重新安排被取消的任務。
            scheduler.schedule(job)
        }
        //還有一個方法。jobFinished(JobParameters params, boolean needsRescheduled) 該方法是在任務執行完成時通知系統(不代表任務被執行成功)。needsRecheduled表示該任務是否被重復執行。
        //例如onStartJob執行結果是True。則實際上任務還在執行。這時候如果任務執行完了。就必須調用這個方法否則后面的任務。
        
    }

總結,Scheduler是一套提供給開發者的一套優化耗電的任務安排方式,還是相當不錯的。

 

其他耗電優化方式請看  app耗電優化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM