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分钟
相关推荐
程序员陆业聪3 小时前
绕过Frida/Xposed的最后防线:SVC直接系统调用与Native反Hook实战
android
程序员陆业聪3 小时前
WebView与原生JS交互:JSBridge生产级实现与安全防护
android
我命由我123456 小时前
Android 开发问题:MlKitException: An internal error occurred during initialization.
android·java·java-ee·android jetpack·android-studio·androidx·android runtime
Meteors.6 小时前
Android自定义 View 三核心方法详解
android
2501_916007476 小时前
前端开发常用软件与工具全面指南
android·ios·小程序·https·uni-app·iphone·webview
赏金术士7 小时前
Android Tinker 热修复集成与使用指南 1.9.15.2
android·热修复·tinker
2603_954138398 小时前
安卓误删文件先别慌!5个实用小技巧指南教你补救
android·智能手机
波诺波10 小时前
5-SOFA可变形的3D物体 5-elasticity.scn
android
2501_9159090611 小时前
iOS应用性能优化:十大策略提升用户体验与开发效率
android·ios·小程序·https·uni-app·iphone·webview
sun00770011 小时前
打通android全链路,网卡驱动, 内核 , 到上层hal, framework
android