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分钟。
相关推荐
Dovis(誓平步青云)3 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码5 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程8 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程9 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程10 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程10 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓10 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程10 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc12311 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium