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分钟
相关推荐
robotx2 小时前
安卓线程相关
android
消失的旧时光-19433 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon4 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon4 小时前
VSYNC 信号完整流程2
android
dalancon4 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013845 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android5 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才6 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶7 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙7 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github