目录
一、JobService
1. 创建JobService子类
2. 清单文件注册JobService
3. 调度作业-启动JobService
(1) 准备JobInfo(作业信息)
(2) 获取JobScheduler(作业调度)
(3) JobScheduler调度JobInfo
二、 JobIntentService
1. 创建JobIntentService子类
2. 清单文件注册JobIntentService
3. 启动JobIntentService
三、前台服务
JobService和JobIntentSerice是为了在程序关闭后>>在指定情况时<<仍然继续执行而创造的。
JobService与JobIntentService的关系类似于Service与IntentService的关系。JobService是在主线程中运行的,而JobIntentService会为每一次启动都准备一个子线程并在其中运行。
Service与InentService会因为App的停运而中止,而JobService与IntentService在App停运后会继续运行。
JobService
:适用于 Android 5.0(API 级别 21)及更高版本。onStartJob()是异步执行的,你需要在作业完成时调用jobFinished()方法来通知系统。这使得你能够在后台线程中执行长时间运行的任务。JobIntentService
:在 Android 8.0(API 级别 26)之前提供向后兼容性,使得你可以在更旧的设备上使用 JobScheduler (作业调度)的功能。onHandleWork()方法在一个独立的工作线程中执行,并且在所有任务完成后会自动停止服务,不需要手动调用stopSelf()或者stopSelfResult()。创建一个继承JobService类的子类,并实现其中的onStartJob()方法和onStopJob()方法。
onStartJob()方法中重写后台任务逻辑,该方法返回true表示作业在这里执行,返回false表示作业执行完毕。
onStopJob()方法中重写作业取消逻辑,该方法返回true表示希望作业被重新调度,返回false表示作业无需再次执行。
想中止任务,可使用JobFinished(JobParameters jp,boolean b)方法并在onStartJob()返回false,该方法第一个参数是当前作业的参数(用于告知系统哪个作业结束了),第二个参数是是否重新调度作业。
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// 在这里执行后台任务逻辑
// 返回 true 表示作业在这里执行,返回 false 表示作业已经执行完毕
return true;
// 停止JobService可使用 jobFinished(params, false)并返回false
// jobFinished(params, false);
// return false;
}
@Override
public boolean onStopJob(JobParameters params) {
// 在这里处理作业被取消的逻辑
// 返回 true 表示希望作业被重新调度
return false;
}
}
请注意,一定要包含 android:permission="android.permission.BIND_JOB_SERVICE" 。
... ...
使用JobInfo.Builder创建,可在其中设置网络条件、充电条件、作业执行周期(单位毫秒)、设备重启自动重新调度作业。
使用getSystemService(JOB_SCHEDULER_SERVICE)获取JobSecheduler。
使用schedule()方法调度JobInfo,启动JobService。
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(this, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // 设置网络条件
.setRequiresCharging(true) // 设置充电条件
.setPeriodic(15 * 60 * 1000) // 设置作业的周期性执行,单位是毫秒
//.setPersisted(true) // 设备重启,作业重新调度
//.setRequiresDeviceIdle(true) //设置作业是否需要设备处于空闲状态才能执行
//.setMinimumLatency(0) //设置作业的最小延迟时间,即作业在何时可以开始执行(毫秒)
//.setOverrideDeadline(5000) //设置作业的截止时间,即作业在何时必须开始执行(毫秒)
.build();
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(jobInfo);
public class MyJobIntentService extends JobIntentService {
protected void onHandleWork(@NonNull Intent intent) {
// 执行任务代码
}
public static void enqueueWork(Context context, Intent work) {
// 该方法为自行创建
// 通过这个静态方法来 enqueue (入队) 任务
enqueueWork(context, MyJobIntentService.class, 2333 , work);
}
}
请注意,一定要包含 android:permission="android.permission.BIND_JOB_SERVICE" 。
... ...
使用enqueueWork()方法启动JobIntentService。
Intent可有附加信息,也可没有。
//Intent
Intent intent=new Intent(MainActivity.this,MyJobIntentService.class);
//附加信息(可不添加)
//intent.putExtra("key", value);
//启动服务(调用自定义静态方法)
MyJobIntentService.enqueueWork(MainActivity.this,intent);
JobService与JobIntentService和Service与IntentService相同,都可以使用startForeground()启动前台(显示通知),使用stopForeground()停止前台(删除通知)。
tag: JobService,JobIntentService,job,JobScheduler,worker,WorkManager,后台服务,后台,service,服务