JobScheduler 相关笔记

📦 JobScheduler:系统级精准调度(API 21+)

JobScheduler是系统服务,允许你设置精确条件(如网络、充电状态),由系统在最优时机批量执行任务,特别适合精确、可靠的后台作业。

使用步骤与示例:

  1. 创建一个JobService 这是执行任务的入口,需要在AndroidManifest.xml中声明。

    kotlin 复制代码
    // 1. 定义你的JobService(例如一个日志上传服务)
    class MyUploadJobService : JobService() {
        override fun onStartJob(params: JobParameters?): Boolean {
            // 此处执行你的后台任务(会在主线程运行,建议异步)
            uploadLogInBackground(params)
            // 返回true表示任务在异步执行,执行完后需手动调用jobFinished
            // 返回false表示任务同步执行完成
            return true
        }
    
        override fun onStopJob(params: JobParameters?): Boolean {
            // 如果任务被系统强制停止,是否需要重新调度?
            // 返回true表示需要重新调度,false表示丢弃
            return false
        }
    
        private fun uploadLogInBackground(params: JobParameters?) {
            // 模拟异步任务
            thread {
                // 执行你的实际任务逻辑...
                Log.d("JobScheduler", "正在上传日志...")
                // 任务完成后,必须通知系统
                jobFinished(params, false) // 第二个参数false表示不需要重新调度
            }
        }
    }
    xml 复制代码
    <!-- 2. 在 AndroidManifest.xml 中声明你的JobService -->
    <service
        android:name=".MyUploadJobService"
        android:permission="android.permission.BIND_JOB_SERVICE" />
  2. 构建JobInfo并调度任务 使用JobInfo.Builder设置任务的各种约束条件。

    kotlin 复制代码
    // 3. 在需要调度任务的地方(如Activity或BroadcastReceiver)
    fun scheduleUploadJob(context: Context) {
        val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
        
        // 创建一个JobInfo.Builder,并指定你的JobService
        // 第一个参数是任务ID,需在应用内唯一
        val jobInfo = JobInfo.Builder(JOB_ID_UPLOAD_LOG, ComponentName(context, MyUploadJobService::class.java))
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // 仅在Wi-Fi下执行
            .setRequiresCharging(true)                               // 仅在充电时执行
            .setPersisted(true)                                      // 设备重启后是否保持调度(需要RECEIVE_BOOT_COMPLETED权限)
            .setPeriodic(15 * 60 * 1000)                             // 设置周期性执行(最少15分钟间隔)
            // .setMinimumLatency(10 * 1000)                         // 设置最小延迟执行(单次任务)
            // .setOverrideDeadline(30 * 60 * 1000)                  // 设置最晚执行期限(单次任务)
            .build()
        
        val result = jobScheduler.schedule(jobInfo)
        if (result == JobScheduler.RESULT_SUCCESS) {
            Log.d("JobScheduler", "任务调度成功!")
        }
    }

核心要点:

  • JobService运行在主线程,耗时操作必须异步。
  • setPersisted(true)需要android.permission.RECEIVE_BOOT_COMPLETED权限。
  • 周期性任务的最小间隔是15分钟
相关推荐
pengyu1 小时前
【Kotlin 协程修仙录 · 金丹境 · 中阶】 | 启动密法:CoroutineStart 四种模式与底层调度玄机
android·kotlin
Android小码家2 小时前
Xposed之雷电5+Android 7.1.2 Xposed 89(古早安装)
android·xposed
ooseabiscuit2 小时前
Laravel2.x核心特性全解析
android
UXbot2 小时前
AI一次生成iOS和Android双端原型功能详解
android·前端·ios·kotlin·交互·swift
YF02112 小时前
基于 CRNN 与 ML Kit 的高性能移动端扫描技术方案
android·aigc
耿公子和编程2 小时前
Android 指纹浏览器开发教程一:先把整体架构拆清楚
android·架构
问心无愧05132 小时前
ctf show web入门48
android·前端·笔记
JohnnyDeng942 小时前
Android 渲染机制深度解析:Choreographer 与 VSYNC 如何驱动每一帧
android
赏金术士2 小时前
Kotlin 习题集 · 基础篇
android·开发语言·kotlin
问心无愧05133 小时前
CTF show web入门45
android·前端·笔记