JobService与JobIntentService

目录

一、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

1. 创建JobService子类

创建一个继承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;
    }
}

2. 清单文件注册JobService

请注意,一定要包含 android:permission="android.permission.BIND_JOB_SERVICE"


        ... ...

        

3. 调度作业-启动JobService

(1) 准备JobInfo(作业信息)

使用JobInfo.Builder创建,可在其中设置网络条件、充电条件、作业执行周期(单位毫秒)、设备重启自动重新调度作业。

(2) 获取JobScheduler(作业调度)

使用getSystemService(JOB_SCHEDULER_SERVICE)获取JobSecheduler。

(3) JobScheduler调度JobInfo

使用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);

二、 JobIntentService

1. 创建JobIntentService子类

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);
    }

}

2. 清单文件注册JobIntentService

请注意,一定要包含 android:permission="android.permission.BIND_JOB_SERVICE"


        ... ...

        

3. 启动JobIntentService

使用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,服务

你可能感兴趣的:(android,java)