AndroidはJobServiceでバックグラウンドサービスを実現


前言Androidでは定時サービスを実現したり、定時にメッセージをプッシュしたり、データを更新したりすることがよくあります.一般的にはサービスを開き、サービスではAlarmManager、setRepeating定時要求を使用する可能性がありますが、API 19からは時効の正確さは保証されていません.5.0以降、GoogleはJobServiceを発売しました.インスタントではないバックグラウンドプロセスを実行するために使用されます.
JobServiceでは、2つの抽象メソッドonStartJob(JobParameters)とonStopJob(JobParameters)を使用します.onStartJobはJobServiceがスケジューリングされたときに実行されます.JobServiceを継承してonStartJobメソッドを書き直し、バックグラウンドタスクを実行すればいいだけです.
   @Override
    public boolean onStartJob(JobParameters params) {
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
APIでは、こんな言葉が
This service executes each incoming job on a Handler running on your application's
main thread. This means that you must offload your execution logic to another
thread/handler/AsyncTask of your choosing. Not doing so will result in blocking any
future callbacks from the JobManager - specifically onStopJob(android.app.job.JobParameters), which is meant to inform you that the
scheduling requirements are no longer being met.
 :JobService                ,    ,        
          ,       ,      JobManager     ,   onStopJob  
onStartJobメソッドでは、主にJobSchedulerに依存して、私たちのタイミングサービスを実行します.まず簡単な例を挙げて、JobServiceを起動して、同時に内部循環操作をして、トーストを弾きます.
 Activity ,    
 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            doService();
        }
  }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void doService() {
        JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(this, TestService.class));  //    JobService    
        builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10)); //         
        builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(15));  //         
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NOT_ROAMING);  //       
        builder.setBackoffCriteria(TimeUnit.MINUTES.toMillis(10), JobInfo.BACKOFF_POLICY_LINEAR);  //      
        builder.setRequiresCharging(false); //      
        jobScheduler.schedule(builder.build());
    }
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class TestService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        doJob();
        doService();
        return true;
    }

    private void doService() {
        JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(this, TestService.class));  //    JobService    
        builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10)); //         
        builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(15));  //         
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NOT_ROAMING);  //       
        builder.setBackoffCriteria(TimeUnit.MINUTES.toMillis(10), JobInfo.BACKOFF_POLICY_LINEAR);  //      
        builder.setRequiresCharging(false); //      
        jobScheduler.schedule(builder.build());
    }

    private void doJob() {
        ToastUtil.ToastNormal(this, "  ");
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}
        
        <service
            android:name=".service.TestService"  
            android:permission="android.permission.BIND_JOB_SERVICE"/>
例として、5つの条件があります.-最短遅延時間setMinimumLatency-最長遅延時間setOverrideDeadline-実行時ネットワーク状態setRequiredNetworkType共有(NETWORK_TYPE_NONEデフォルト)、(NETWORK_TYPE_ANY任意ネットワーク状態)、(NETWORK_TYPE_UNMETERD計量不要ネットワーク状態)、(NETWORK_TYPE_NOT_ROAMING非ローミング状態)-再試行シナリオsetBackoffCriteria 1番目のパラメータは時間で、2番目は再試行シナリオにJobInfo.BACKOFF_POLICY_LINEARリミットシナリオ、BACKOFF_POLICY_EXPONENTIAL指数シナリオがあります.-充電状態でsetRequiresChargingを実行する必要があるかどうかはfalseのデフォルトです.また、-週間隔setPeriodic-デバイスが再起動した後に継続するかどうか権限がある場合は、setTriggerContentMaxDelayは、ジョブがスケジュールされるまで、最初の*時間からコンテンツの変更が許容される最大総遅延(ミリ秒単位)を検出するように設定します.
締め括りをつける
  • JobServiceを継承し、onStartJobおよびonStopJobメソッド
  • を書き換える
  • manifest.xmlでJobServiceを宣言する場合は、android:permission="android.permission.BIND_JOB_SERVICE"
  • を加える
  • JobServiceは時間のかかるタスクを実行できません.もしそうする必要があるなら、必ず新しいスレッドを開いて
  • を操作しなければなりません.
  • JobServiceは、ネットワーク接続、充電中、システム空きなど、少なくとも1つの実行条件を設定する必要があります.
    バックグラウンド・タスクがJobServiceの1つ以上の制約を満たす場合、JobServiceで実行すべきかどうかを考慮できます.