Android - JobService常用场景分析

简介: Android - JobService常用场景分析

概览


JobScheduler是android系统提供的一个任务执行框架,通过JobScheduler我们可以根据不同的策略调度任务的执行。

例如:

  1. 指定任务可以在指定的网络下执行
  2. 指定任务只在充电的状态下进行
  3. 设置任务的截止时间
  4. 指定延迟一段时间后执行任务
  5. 指定任务在手机空闲的情况下执行

如果app被杀死则无法最终执行任务,如果有重启后需要继续执行这种需要建议使用WorkManager


使用


基本使用

创建自定义JobService并在manifest中配置

class ExeTaskAfter2SecondService: JobService() {
    override fun onStartJob(params: JobParameters?): Boolean {
        logEE("延迟五秒执行:onStartJob")
        return true
    }
    override fun onStopJob(params: JobParameters?): Boolean {
        logEE("延迟五秒执行:onStopJob")
        return true
    }
}
复制代码


<service android:name=".service.ExeTaskAfter2SecondService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            />
复制代码


调度任务执行

val mJobScheduler = getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler//获取系统服务
            val mBuilder = JobInfo.Builder(1, ComponentName(this, ExeTaskAfter2SecondService::class.java))//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service
            var mJobInfo = mBuilder
                .setMinimumLatency(5000)//指定5s后执行任务
                .build()
            mJobScheduler.schedule(mJobInfo)//开始调度任务执行
复制代码


取消任务执行

mJobScheduler.cancel(1)//这个id就是schedule时指定的任务id
 mJobScheduler.cancelAll()//取消全部任务
复制代码


设置任务的截止时间

var mJobInfo = mBuilder
                .setOverrideDeadline(5000)//五秒内一定会执行一次
                .build()
            mJobScheduler.schedule(mJobInfo)
复制代码


设置任务执行的网络状态

只在移动网络的时候执行

如果开始任务时没有连接无线网络则不执行,然后当我们连接无线网络时会自动开始执行网络

val mBuilder = JobInfo.Builder(
                1,
                ComponentName(this, ExeTaskAfter2SecondService::class.java)
            )//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service
            var mJobInfo = mBuilder
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_CELLULAR)
                .build()
            mJobScheduler.schedule(mJobInfo)//开始调度任务执行
复制代码


指定job执行时的网络流量大小限制

感觉基本用不上,打不情况我们不会考虑流量,所以我也没有测试

setEstimatedNetworkBytes (long downloadBytes, long uploadBytes)
复制代码


设置非低电量时执行

setRequiresBatteryNotLow
复制代码


必须有网络连接的时候才能执行

NETWORK_TYPE_ANY


无论是否有网络都可以执行

NETWORK_TYPE_NONE


只有wifi情况下才能执行

NETWORK_TYPE_UNMETERED


指定任务在手机空闲时执行

setRequiresDeviceIdle

这种方式很难预测

val mBuilder = JobInfo.Builder(
                1,
                ComponentName(this, ExeTaskAfter2SecondService::class.java)
            )//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service
            var mJobInfo = mBuilder
//                .setOverrideDeadline(5000)//如果设置了dealline时间,则即使设置了setRequiresDeviceIdle到达截止时间时也会执行
                .setRequiresDeviceIdle(true)
                .build()
            mJobScheduler.schedule(mJobInfo)//开始调度任务执行
复制代码


设置充电的状态下才能执行

如果我们执行任务时,手机没有充电则不会执行,当我们插上电源的时候任务会自动开始执行

mJobScheduler = getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler
 val mBuilder = JobInfo.Builder(
                1,
                ComponentName(this, ExeTaskAfter2SecondService::class.java)
            )//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service
            var mJobInfo = mBuilder
                .setRequiresCharging(true)//设置充电时才能执行
                .build()
            mJobScheduler.schedule(mJobInfo)//开始调度任务执行
复制代码


api介绍


JobService.onStartJob

JobScheduler.schedule调用的时候会回调onStartJob方法

onStartJob方法的返回值:

如果返回false表示该任务随方法执行完成而结束,后续不会再调用onStopJob方法(即使我们主动调用了cancel方法)

如果返回true则方法可以被反复执行


JobService.onStopJob

调用JobSchdeuler.cancel会触发onStopJob回调


JobService.jobFinished

jobFinished(params,false):第一个参数JobParameters,第二个参数表示是否重复执行
复制代码

主动通知系统已经完成了任务



相关文章
|
20天前
|
安全 Shell Android开发
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
33 0
|
20天前
|
安全 Android开发
Android13 Root实现和原理分析
Android13 Root实现和原理分析
48 0
|
20天前
|
Java Android开发
Android系统 获取用户最后操作时间回调实现和原理分析
Android系统 获取用户最后操作时间回调实现和原理分析
21 0
|
2月前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
31 1
|
3月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
43 4
|
4月前
|
监控 Android开发 C语言
深度解读Android崩溃日志案例分析2:tombstone日志
深度解读Android崩溃日志案例分析2:tombstone日志
95 0
|
4月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
31 0
|
20天前
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
44 0
|
3天前
|
存储 Android开发
android launcher总体分析
android launcher总体分析
|
5天前
|
编解码 缓存 安全
Android SELinux 参数语法介绍及基础分析
Android SELinux 参数语法介绍及基础分析
10 0