大家知道,android8.0对后台service限制很严格,官方推荐使用AlarmManager、SyncAdapter、JobScheduler代替后台服务,这里我们说一说JobScheduler的简单使用。
首先创建一个Jobservice:
public class MyJobService extends JobService {
public static String TAG = "MyJobService";
Context mContext;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public boolean onStartJob(final JobParameters params) {
Log.d(TAG, "onStartJob ");
new Thread(new Runnable() { // JobService默认在主线程中执行,如果操作耗时任务,需要启用新线程执行
@Override
public void run() {
// 具体业务逻辑代码
Log.d(TAG, "onStartJob run() ");
try {
Thread.sleep(3000);
jobFinished(params,false); // 如果onStartJob返回true的话需要调用此方法表示任务执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
return true; // 返回false表示任务执行完毕,下一个任务即将展开,true表示任务还未执行结束,需要手动调用jobFinished;
}
@Override
public boolean onStopJob(JobParameters params) { //在onStartJob()返回true的前提下, 取消cancel或者强制停止Job任务的时候才会调用到此方法
Log.d(TAG, "onStopJob");
return false; // 任务是否应该在下次继续
}
}
其次需要在manifest中申明权限:
<service
android:name=".ui.AlarmCheckJobService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" /> // 很重要!!!!
然后创建JobScheduler:
ComponentName jobService = new ComponentName(this, AlarmCheckJobService.class);
JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
最后创建Job,开启任务
JobInfo.Builder builder = new JobInfo.Builder(1, jobService);
JobInfo jobInfo = builder
.setPeriodic(15 * 60 * 1000) // 每隔15分钟运行一次
.setMinimumLatency(0) // 设置任务运行最少延迟时间
.setOverrideDeadline(60000) // 设置deadline,若到期还没有达到规定的条件也会开始执行
.setPersisted(true) // 设备重新启动之后你的任务是否还要继续运行
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // 设置网络条件(不是蜂窝网络( 比方在WIFI连接时 )时任务才会被运行)
.setRequiresCharging(true) // 设置是否充电的条件
.setRequiresDeviceIdle(false) // 设置手机是否空闲的条件
.setRequiresCharging(true) // 这种方法告诉你的应用,仅仅有当设备在充电时这个任务才会被运行。
.setRequiresDeviceIdle(true) //这种方法告诉你的任务仅仅有当用户没有在使用该设备且有一段时间没有使用时才会启动该任务。
.build();
scheduler.schedule(jobInfo);
以上就是JobService的简单使用,不对的地方欢迎指正出来,一起交流共同进步!