📦 JobScheduler:系统级精准调度(API 21+)
JobScheduler是系统服务,允许你设置精确条件(如网络、充电状态),由系统在最优时机批量执行任务,特别适合精确、可靠的后台作业。
使用步骤与示例:
-
创建一个
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" /> -
构建
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分钟。