MST
星途 面试题库

面试题:Kotlin的WorkManager周期性任务在设备重启后如何确保继续执行

在Kotlin使用WorkManager创建周期性任务,当设备重启后,如何保证该周期性任务能够继续按照设定的周期执行?请详细描述实现步骤和涉及到的相关组件及方法。
14.1万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 注册 BroadcastReceiver 监听设备重启
    • AndroidManifest.xml 中注册一个 BroadcastReceiver 来监听 android.intent.action.BOOT_COMPLETED 广播。
    <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    
  2. 创建 BootReceiver
    • BootReceiver 类中,当接收到设备重启广播时,重新启动 WorkManager 的周期性任务。
    class BootReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
                val constraints = Constraints.Builder()
                   .setRequiresCharging(false)
                   .setRequiredNetworkType(NetworkType.NOT_REQUIRED)
                   .build()
                val myWorkRequest = PeriodicWorkRequestBuilder<MyWorker>(15, TimeUnit.MINUTES)
                   .setConstraints(constraints)
                   .build()
                WorkManager.getInstance(context).enqueue(myWorkRequest)
            }
        }
    }
    
  3. 定义 MyWorker
    • 这是 WorkManager 执行任务的具体工作类。
    class MyWorker(appContext: Context, workerParams: WorkerParameters) :
        Worker(appContext, workerParams) {
        override fun doWork(): Result {
            // 在此处编写具体的任务逻辑
            return Result.success()
        }
    }
    
  4. 权限声明
    • AndroidManifest.xml 中添加接收设备重启广播所需的权限:
    <uses - permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    

涉及到的相关组件及方法

  • WorkManager:用于管理异步任务,通过 WorkManager.getInstance(context) 获取实例,enqueue(WorkRequest) 方法用于将任务加入队列执行。
  • PeriodicWorkRequestBuilder:用于创建周期性任务请求,设置任务执行周期等参数。
  • Constraints:用于定义任务执行的约束条件,如是否需要充电、网络类型等,通过 Constraints.Builder 构建。
  • BroadcastReceiver:用于接收系统广播,这里用于监听设备重启广播。
  • Intent.ACTION_BOOT_COMPLETED:系统广播的 action,用于标识设备重启事件。