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分钟。
相关推荐
警醒与鞭策2 小时前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
传奇开心果5 小时前
【Compose Multiplatform跨端声明式UI实用技术】第19课:多平台部署与发布
android·kotlin
红尘伴蝶舞5 小时前
加密拦截器让抓包失效,我只能从 4KB 的 logcat 碎片里拼回 JSON
android·kotlin·ai编程
booboosui5 小时前
219 个还是 0 个:读不到微信界面时,我只加不删
android
Android打工仔5 小时前
Compose 中何时该用 padding,何时该用 offset
android·android jetpack
二流小码农5 小时前
HarmonyOS开发助手,0代码让元服务从开发到上架
android·ios·harmonyos
limit00755 小时前
三维 WebGIS 工具选型:加载、样式、分析、交付,一套界面能做完什么
android·前端·web3·安卓·webgl
骑着蜗牛撵大象3277 小时前
让 Codex 值夜班:把告警排查与巡检接成可回滚的自动化链路
android·java·运维·ai·自动化·codex·智能体
2401_885885047 小时前
芬兰语音通知接口怎样对接?语音提醒接入流程
android·前端·python·php·语音识别
程序猿老A7 小时前
轻量应用服务器怎么用phpcms搭建网站?
android