Android 9.0 JobScheduler(一) JobScheduler的使用

本文介绍了Android 9.0中的JobScheduler,它是一个用于作业调度的系统服务,能智能地根据约束条件执行作业。文章详细讲解了JobScheduler的组件,包括JobScheduler、JobInfo、JobInfo.Builder、JobService和JobParameters,以及它们的使用步骤和API。还阐述了如何创建JobService子类、设置作业约束以及如何调度Job。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎大家关注我的掘金帐号
我会在那里定期更新最新版本的Android Framework源码模块分析~~

1.JobScheduler简介

JobScheduler是一个系统提供的框架,旨于在应用进程、而非系统进程内执行各种作业调度,其原理是启动通过bindservice的方式启动对应应用进程的service,并在Service中进行作业。在执行一个Job时,将会使得系统持有一个WakeLock锁,以防止系统休眠进入Suspend。

在创建一个作业时,会设置多个约束条件,比如可以指定特定的网络、是否只在充电时执行作业等,JobScheduler框架会根据这些约束条件,智能地执行作业,并尽可能对作业进行批操作和推迟,以防止频繁唤醒系统而影响功耗,还可以指定该Job的执行的截至期限。如果不指定一个作业的截至期限,那么该作业可能会在任意一个时刻运行,这取决于JobScheduler的内部队列。

2.JobScheduler组件

JobScheduler的使用比较简单,JobScheduler框架为应用提供了如下四个组件,通过这四个类的API可以让用户在应用中创建一个作业,并让系统对他进行调度。

  • 1.JobScheduler

JobScheduler类负责将应用需要执行的作业发送给框架,以准备对该应用Job的调度。JobScheduler是一个系统服务,可通过如下方式获取:

JobScheduler mJobScheduler = (JobScheduler) Context.getSystemService(Context.JOB_SCHEDULER_SERVICE). 
  • 2.JobInfo

JobInfo是传递给JobScheduler类的数据容器,它封装了针对调用应用程序调度作业所需的各种约束,也可以认为一个JobInfo对象对应一个作业,JobInfo对象通过JobInfo.Builder创建。它将作为参数传递给JobScheduler:

mJobScheduler.scheduler(mJobInfo);
  • 3.JobInfo.Builder

JobInfo.Builder是JobInfo的一个内部类,顾名思义,它就是用来创建JobInfo的Builder类。

JobInfo.Builder mBuilder = new JobInfo.Builder(id,new ComponentName(this,MyJobService.class));
mJobInfo = mBuilder.build();
  • 4.JobService

JobService是一个继承于Service的抽象类,他作为系统回调执行作业内容的终端,JobScheduler框架将通过bindService()方式来启动该服务.因此,用户必须在应用程序中创建一个JobService的子类,并实现其onStartJob()等回调方法,以及在清单文件中对它授予如下权限:

<service android:name=".MyJobService"
    android:permission="android.permission.BIND_JOB_SERVIC
### Android 9.0 中的进程保活技术方案 在Android 9.0中,为了保持应用的后台运行状态并防止被系统轻易回收,可以采用多种策略来增强服务和应用程序的整体存活率。 #### 使用前台服务 通过启动个前台服务,可以使该服务获得更高的优先级。这可以通过调用`startForeground()`方法实现,并提供个通知给用户显示当前有重要的操作正在进行[^1]。 ```java Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID) .setContentTitle("Service Running") .setContentText("This is a foreground service.") .setSmallIcon(R.drawable.ic_notification) .build(); service.startForeground(ONGOING_NOTIFICATION_ID, notification); ``` #### 设置Service为粘性服务 当返回`START_STICKY`时,在某些情况下确实可能无法达到预期的效果,因为自Android Oreo以来,Google加强了对后台任务执行的限制。然而,仍然可以在适当场景下尝试设置此标志位以增加重启的可能性[^2]: ```java @Override public int onStartCommand(Intent intent, int flags, int startId) { // Do something here... return START_STICKY; } ``` #### 利用JobScheduler调度作业 对于周期性的任务处理需求,推荐使用`JobScheduler` API 来安排工作而不是依赖定时器或其他机制触发的服务。这种方式不仅更节能而且更容易适应系统的资源管理政策. #### 处理广播接收者 注册些特定类型的广播事件可以帮助维持应用处于活跃状态。例如监听屏幕亮灭、连接变化等重要时刻,从而适时激活组件或发送心跳包维护网络会话的有效性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值