Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库。这意味着,它可以提供向后兼容性,且比 Android 平台的更新频率更高,以此确保您始终可以获取最新且最好的 Jetpack 组件版本。
结合自己的阅读源码、实战经历总结。记录分享一下。
- 轻松管理你的后台任务—WorkManager(使用篇)
- 轻松管理你的后台任务—WorkManager(进阶篇)
- Android项目组件化/模块化,用LiveData打造属于你组件通信框架EventBus
- 还在等什么,用LiveData手撸一个Retrofit吧
- 未完待续,也可以踊跃投稿至【[深入浅出Android-Jetpack系列】
预备知识
1.Android 基础知识
2.LiveData基本了解和使用
3.Room数据库的基本了解和使用
读完本文可以学到什么
- 认识高效后台任务管理框架-WorkManager
- WorkManager的使用以及经典场景
一、认识高效后台任务管理框架-WorkManager
WorkManager是google推出来的Jetpack大家族中的一员,他能够轻松的执行可延期的异步任务,甚至在app退出或者设备重启都不中断你的任务。
关键特征:
- 兼容到API14。
- 在API 23及其以上使用Job JobScheduler。
- 在API 14-22使用 BroadcastReceiver + AlarmManager。
- 为任务添加约束,比如网络连接、充电中、存储空间充足时等。
- 任务可以选择只执行一次或者周期执行。
- 监控和管理你的任务。
- 可以执行任务链。
- 执行任务甚至在app退出和设备重启时。
*让你的设备尽可能的省电、比如Doze模式。
这段是从官网翻译过来的。当然我的梦想不是当一名翻译官,哈哈。下面介绍一下WorkManager的工作流程。
我用Axure画了张图,凑合着看看吧。首先构造一个包含Worker的WorkRequest,可以为WorkRequest添加输入数据(Data)、添加约束、BackOff、Tag等。然后交给WorkManager去enqueue。先将任务存储到Room,然后WorkManager根据系统api选择合适的任务调度器去执行任务。执行任务的时候会变更Room数据库任务的状态,Room与LiveData结合,我们就可以拿到监听到状态去作出相应的处理了。
WorkManager的使用以及经典场景
WorkManager的使用还是非常简单的。这里为了避免篇幅不大段大段的贴代码了。首先创建个Worker
public class UploadWorker extends Worker {
public UploadWorker(
@NonNull Context context,
@NonNull WorkerParameters params) {
super(context, params);
}
@Override
public Result doWork() {
// Get the input
String imageUriInput = getInputData().getString(Constants.KEY_IMAGE_URI)
// TODO: validate inputs.
// Do the work
Response response = uploadFile(imageUriInput)
// Create the output of the work
Data outputData = new Data.Builder
.putString(Constants.KEY_IMAGE_URL, response.imageUrl)
.build();
// Return the output
return Result.success(outputData)
}
}
然后构建WorkRequest,入队。更多详细的用法可以去查看官网。直戳官方方法指南。
Data imageData = new Data.Builder
.putString(Constants.KEY_IMAGE_URI, imageUriString)
.build();
// Create a Constraints object that defines when the task should run
Constraints constraints = new Constraints.Builder()
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
.build();
OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
.setInitialDelay(10, TimeUnit.MINUTES)
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS)
.setInputData(imageData)
.setConstraints(constraints)
.build();
//入队
WorkManager.getInstance().beginWith(uploadWorkRequest).enqueue();
//监听
WorkManager.getInstance().getWorkInfoByIdLiveData(uploadWorkRequest.getStringId()).observe(this, new Observer() {
@Override
public void onChanged(@Nullable WorkInfo workInfo) {
}
});
下面要重点说说使用场景了。WorkManager适用于那些在应用退出之后任务还需要继续执行的需求,对应那些在应用退出的之后任务也需要终止的情况就需要选择ThreadPool来实现。 这个非常重要。比如上传日志、定时任务等可以选择WorkManager。当然博主不建议大家在商业项目上用WorkManger,oppo/vivo等厂商尤其是OPPO对app功耗问题把控的非常严格,具体原因在下篇源码篇会分享,顺带填一下遇到的坑。