公司动态

Android随笔-WorkManager 与 AlarmManager

📅 2026/7/16 14:02:23
Android随笔-WorkManager 与 AlarmManager
Android WorkManager 与 AlarmManager 详解一、WorkManager是什么WorkManager 是 Android Jetpack 组件用于调度可延迟、可保证执行的后台任务。它是 Google 推荐的后台任务首选方案。核心特性特性说明保证执行即使 App 被杀死、设备重启任务依然会被执行需满足约束条件自动选择 API内部根据系统版本自动选择 JobSchedulerAPI 23、AlarmManager BroadcastReceiverAPI 14-22或 Firebase JobDispatcher约束条件可设置网络状态、电量、存储空间等条件链式任务支持任务依赖A 完成后执行 B观察状态通过 LiveData/Flow 观察任务执行状态适用场景同步数据到服务器非即时上传日志定期清理缓存图片压缩/处理代码示例// 定义 WorkerclassUploadWorker(context:Context,params:WorkerParameters):CoroutineWorker(context,params){overridesuspendfundoWork():Result{// 执行后台任务valsuccessuploadData()returnif(success)Result.success()elseResult.retry()}}// 调度任务valconstraintsConstraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED)// 需要网络.setRequiresBatteryNotLow(true)// 电量充足.build()valuploadWorkOneTimeWorkRequestBuilderUploadWorker().setConstraints(constraints).setInitialDelay(10,TimeUnit.MINUTES)// 延迟10分钟.addTag(upload).build()WorkManager.getInstance(context).enqueue(uploadWork)// 观察状态WorkManager.getInstance(context).getWorkInfoByIdLiveData(uploadWork.id).observe(lifecycleOwner){workInfo-if(workInfo?.stateWorkInfo.State.SUCCEEDED){// 任务成功}}周期性任务valperiodicWorkPeriodicWorkRequestBuilderSyncWorker(15,TimeUnit.MINUTES// 最小间隔15分钟系统限制).build()WorkManager.getInstance(context).enqueueUniquePeriodicWork(sync,ExistingPeriodicWorkPolicy.KEEP,periodicWork)二、AlarmManager是什么AlarmManager 是 Android 系统级服务用于在精确时间点触发事件。它基于系统闹钟机制即使设备休眠也能唤醒。核心特性特性说明精确触发可精确到毫秒级触发API 19 前API 19 默认批量处理以省电唤醒设备可设置唤醒类型在设备休眠时也能触发系统级服务直接对接 Linux 闹钟机制独立于 App 生命周期不保证执行App 被强制停止后闹钟会被清除除非设置允许重启适用场景闹钟应用必须在 8:00 响铃定时提醒日程、吃药需要在精确时间执行的操作与 UI 强相关的定时任务代码示例valalarmManagercontext.getSystemService(Context.ALARM_SERVICE)asAlarmManagervalintentIntent(context,AlarmReceiver::class.java)valpendingIntentPendingIntent.getBroadcast(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENTorPendingIntent.FLAG_IMMUTABLE)// 精确闹钟API 23 需要 SCHEDULE_EXACT_ALARM 权限if(Build.VERSION.SDK_INTBuild.VERSION_CODES.M){alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,// 使用 RTC休眠时唤醒System.currentTimeMillis()60000,// 1分钟后触发pendingIntent)}// 重复闹钟不精确系统会批量优化alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),AlarmManager.INTERVAL_HOUR,// 每小时pendingIntent)接收器classAlarmReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){// 闹钟触发这里执行操作// 注意onReceive 在主线程耗时操作需启动 Service 或 WorkManager}}三、核心对比维度WorkManagerAlarmManager精确性不保证精确时间系统会批量优化可精确到毫秒需权限保活能力强App 被杀、重启后仍能执行弱App 被强制停止后闹钟清除唤醒设备不会唤醒休眠设备省电可配置唤醒休眠设备约束条件丰富网络、电量、存储等无任务链支持复杂依赖链不支持观察状态支持 LiveData/Flow 观察不支持系统限制最小间隔 15 分钟API 19 默认批量处理推荐使用后台数据同步、延迟任务闹钟、精确提醒四、底层原理简述WorkManagerApp 进程 → WorkManager → 持久化到 Room 数据库 → 系统 JobScheduler / AlarmManager BroadcastReceiver → 满足约束条件后 → 启动进程执行 Worker关键点任务信息持久化到 SQLite即使进程被杀系统服务仍能调度。AlarmManagerApp → AlarmManagerService → 写入 Linux RTC 设备 → 定时到达 → 内核唤醒系统 → 发送广播 → Receiver.onReceive()关键点直接对接 Linux 实时时钟独立于 App 生命周期。五、如何选择需要精确时间触发闹钟、提醒 → AlarmManager 前台服务 需要保证执行但时间可灵活 → WorkManager 需要周期性后台同步 → WorkManager 周期性任务 需要在精确时间做后台数据处理 → AlarmManager 触发 → WorkManager 执行最佳实践AlarmManager 负责准时叫醒WorkManager 负责可靠执行。两者可以配合使用。六、Android 12 的新限制版本限制API 31SCHEDULE_EXACT_ALARM变为特殊权限用户需在设置中手动授予API 33引入USE_EXACT_ALARM权限仅系统应用、闹钟应用可用Doze 模式普通 AlarmManager 在 Doze 下被延迟需使用setAndAllowWhileIdle这些限制进一步强化了 Google 的意图精确闹钟只给真正需要它的应用如闹钟普通后台任务请用 WorkManager。