Android源码分析之 JobScheduler

366 阅读1分钟

5.0API以后用的JobScheduler 5.0API之前用GCM---谷歌的Google Play ServiceManager,国内基本是废的。(里面有很多的网络优化的代码--包括访问策略等)

package com.nan.batterydemo;

import android.annotation.TargetApi; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.BatteryManager; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.WindowManager;

import java.util.List;

@TargetApi(21) public class MainActivity extends AppCompatActivity {

private static final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ComponentName serviceComponent = new ComponentName(this, MyJobService.class);
    //频繁地唤醒
    JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    for (int i = 0; i < 500; i++) {
        JobInfo jobInfo = new JobInfo.Builder(i, serviceComponent)
                .setMinimumLatency(5000)//最小延时5秒
                .setOverrideDeadline(60000)//最多执行时间60秒

// .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)//免费的网络---wifi 蓝牙 USB .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)//任意网络---wifi //设置重试(退避)策略:当一个任务失败的时候,采取什么重试策略 //第一次尝试重试的等待时间间隔 .setBackoffCriteria(JobInfo.DEFAULT_INITIAL_BACKOFF_MILLIS, JobInfo.BACKOFF_POLICY_LINEAR) //设置设备重启以后,这个任务是否还需要保留 //.setPeriodic() // //.setPersisted() .build(); jobScheduler.schedule(jobInfo);

        //取消job,如果任务已经正在执行了是不能取消的
        jobScheduler.cancel(1);
        //取消所有job
        jobScheduler.cancelAll();

        //获取该进程里面所有等待的任务
        List<JobInfo> allPendingJobs = jobScheduler.getAllPendingJobs();
    }

}

}