实现功能:程序被结束后 ,在有自启权限的情况下,自动唤醒app。
正常打开(自动启动服务)->注册任务管理->用户方法->程序被结束(异常结束,系统强制结束)[已停止运行]->WorkManager执行doWork方法[可以添加启动服务等代码]->服务正常运行
添加implementation "androidx.work:work-runtime:2.7.0"依赖
在窗口onCreate或者程序application onCreate里面加入下面的任务管理初始化代码,以保证服务正常。
try { WorkManager.initialize(getApplicationContext(), new Configuration.Builder().build()); }catch (Exception ignore){}
然后添加类
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
// 在这里执行后台任务逻辑
// 返回 Result.success() 表示任务执行成功,返回 Result.failure() 表示任务执行失败
return Result.success();
}
}
下面两种可以任选一种
// 创建 WorkRequest 对象,可以是 OneTimeWorkRequest 或 PeriodicWorkRequest
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
.setInitialDelay(10, TimeUnit.MINUTES) // 可选,设置任务初始延迟
.build();
// 提交 WorkRequest 对象给 WorkManager 进行调度
WorkManager.getInstance(context).enqueue(workRequest);
下面的代码是保证任务只被加入计划一次,不然任务列表里一堆重复任务。
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
.setInitialDelay(60, TimeUnit.SECONDS) // 可选,设置任务初始延迟
.build();
// 提交 WorkRequest 对象给 WorkManager 进行调度
WorkManager.getInstance(this).enqueueUniqueWork("restart",ExistingWorkPolicy.REPLACE,workRequest);
System.out.println("定时唤醒已设置");
如果想要获取任务的执行结果,可以执行下面的代码
WorkManager.getInstance(context).getWorkInfoByIdLiveData(workRequest.getId())
.observe(lifecycleOwner, workInfo -> {
if (workInfo != null && workInfo.getState() == WorkInfo.State.SUCCEEDED) {
// 任务执行成功
} else if (workInfo != null && workInfo.getState() == WorkInfo.State.FAILED) {
// 任务执行失败
}
});
orkManager 使用了多种技术来实现后台任务的调度和保持运行的能力,具体取决于设备和系统版本。以下是一些 WorkManager 使用的关键技术:
JobScheduler:在 Android 5.0(API 级别 21)及以上版本中,WorkManager 使用了 JobScheduler API 来调度后台任务。JobScheduler 具有系统级别的优化,可以根据系统资源和电池状况动态调整任务的执行时间。WorkManager 利用了 JobScheduler 的优势,并提供了一个稳定且兼容各种设备的后台任务调度解决方案。
AlarmManager:在 Android 4.4(API 级别 19)及以下版本中,WorkManager 使用了 AlarmManager 来触发后台任务。它会利用 AlarmManager 设置闹钟,并在闹钟触发时执行后台任务。这种机制在旧版本的 Android 上提供了后台任务调度的能力。
BroadcastReceiver:WorkManager 还使用了 BroadcastReceiver 来监听设备的启动广播(BOOT_COMPLETED),以便在设备启动后重新调度未完成的任务。这确保了即使设备重新启动,仍然可以继续执行之前安排的任务。
通过使用这些技术和适当的调度策略,WorkManager 能够保持后台任务的执行,并确保任务的稳定性和节能性。它结合了系统级别的调度优化和跨设备的兼容性,提供了一种强大而可靠的后台任务调度解决方案。