ジョブ・スケジュールを使用してタスクを合理的にスケジュールします.


転載先:https://www.cnblogs.com/ouyanliu/p/7220279.html?utm_source=itdadao&utm_medium=referral
JobScheduleはAndroid 5.0以降に追加されたもので、以前のバージョンはありません.
JobScheduleの原理は任務を適切な実際に配置して操作する方案のメカニズムである.具体的には、次のようなオプションのタイミングが用意されています.
  • は、利用可能なネットワークの下で実行する.7.0までに、アプリケーションは、ネットワークの変化を傍受することによってタスクを実行することができ、もちろん、アプリケーションが生存しなければならないことが前提である.7.0以降、このようなAPIは失効したが、JobScheduleメカニズムはネットワークの変化の傍受を提供した.さらに、ネットワークが変化する場合に何らかの動作を実行することができる.例えばwifi環境下でダウンロードタスク等を実行する.
  • デバイスは、充電またはアイドル時にいくつかのタスクを実行する.
  • は実行する時間を設定し、これは上記の2つの条件とともに使用する.

  • 具体的な実現は以下の通りである.
    1タスクスケジュール
    //   JobScheduler   
    final JobScheduler scheduler = context.getSystemService(JobScheduler.class);
    //  
    final JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE );
    
    //  JobInfo  jobId  jobID. BusinessService  Job   Service,  Service    JobService
    final JobInfo.Builder builder = new JobInfo.Builder(jobId, new ComponentName(context,  BusinessService.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)
    
    //     jobId             
    final int jobId = (int) info.mId;
    scheduler.cancel(jobId);
    
    //  Job,  packageName          Job(        ).  userId      Job
    scheduler.scheduleAsPackage(builder.build(),  packageName,  UserHandle.myUserId(),  TAG);
    

    2処理任务タスクが手配されると、JobSchedulerサービスに記録されるはずです.条件が満たされると、jobに対応するjobサービスが起動する、そうでない場合.
    まずJobServiceの構成と定義
    <!–           true,             JobService >
    <!–             >
    <service
        android:name=".BusinessService"
        android:exported="true"
        android:permission="android.permission.BIND_JOB_SERVICE"
    />
    
    public class BusinessService extends JobService {
            //    Job  . (    )    false     Job       .   true     Job     . 
            public boolean onStartJob(JobParameters params) {
                final int id = params.getJobId();
                //....    Job
    
                //1              ,     return false. 
                //2        ,            ,     true.             jobFinished
                myHandler.removeMessages(id);
                myHandler.sendEmptyMessage(id);
            }
    
            //Job    ,     ,           ,           ,       ,      . 
            public boolean onStopJob(JobParameters params) {
                //              . 
                scheduler.schedule(job)
            }
            //      . jobFinished(JobParameters params, boolean needsRescheduled)                 (          ). needsRecheduled            . 
            //  onStartJob     true.           . 
            //           .                     .  
        }
    

    まとめると、Schedulerは開発者に提供する最適化消費電力のタスクの手配方式である.
    その他の消費電力の最適化方法はappの消費電力の最適化を見てください