JobService是Android L时候官方新增的组件,适用于需要特定条件才执行后台任务的场景。由系统统一管理和调度,在特定场景下使用JobService更加灵活和省心,相当于是Service的加强或者优化。
JobService是JobScheduler的回调,是安排的Job请求的实际处理类。需要我们覆写onStartJob (JobParameters)方法,并在里面实现实际的任务逻辑。因为JobService的执行是在APP的主线程里响应的,所以必须提供额外的异步逻辑去执行这些任务。
代码如下:
- import android.app.AlarmManager;
- import android.app.PendingIntent;
- import android.app.job.JobInfo;
- import android.app.job.JobParameters;
- import android.app.job.JobScheduler;
- import android.app.job.JobService;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Build;
-
- public class MyJobService extends JobService {
- private static final int JOB_ID = 1;
- private static final long INTERVAL_MILLIS = 10 * 1000; // 10 seconds
-
- @Override
- public boolean onStartJob(JobParameters params) {
- // 在这里执行你的后台任务
- System.out.println("==Job started==");
- scheduleJob(getApplicationContext()); // 重新调度作业
- return false;
- }
-
- @Override
- public boolean onStopJob(JobParameters params) {
- // 在这里取消你的后台任务
- System.out.println("Job stopped");
- return false;
- }
-
- public static void scheduleJob(Context context) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
- ComponentName componentName = new ComponentName(context, MyJobService.class);
- JobInfo jobInfo = new JobInfo.Builder(JOB_ID, componentName)
- .setMinimumLatency(INTERVAL_MILLIS)
- .setOverrideDeadline(INTERVAL_MILLIS)
- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
- .build();
- jobScheduler.schedule(jobInfo);
- } else {
- // 在 Android N 以下版本,使用 AlarmManager 实现定时任务
- Intent intent = new Intent(context, MyJobService.class);
- PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, pendingIntent);
- }
- }
- }
在activity里面调用:
MyJobService.scheduleJob(this)