Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WorkManager in Android 1 —— 初见 #215

Open
soapgu opened this issue Aug 1, 2023 · 0 comments
Open

WorkManager in Android 1 —— 初见 #215

soapgu opened this issue Aug 1, 2023 · 0 comments
Labels

Comments

@soapgu
Copy link
Owner

soapgu commented Aug 1, 2023

  • Service的局限性

  • IntentService已经过时

一上来看说明:This class was deprecated in API level 30.
IntentService is subject to all the background execution limits imposed with Android 8.0 (API level 26). Consider using WorkManager instead.
已经不建议使用了

  • Service可能会被系统回收
    这是一个小麻烦,如果系统资源不足或者Activity不在活动状态,Service有可能被干掉可能。一个是没有安全感,第二个感觉一个永不停止的Service似乎也不是设计Service的“本意”。周期性的任务似乎应该有更好的解决方案

  • 绑定的服务和前台服务暂时安全
    经过测试绑定服务和前台服务“不容易”被系统回收,应该可以放心使用
    但是有限制

  1. 要么需要在绑定状态
  2. 要么前台服务,需要有通知状态
  • WorkManager 简介

好在WorkManager填补了部分需求空白

  1. WorkManager的底层实现

图片
可以看出来WorkManager的底层实现在不同API有不同的实现。不过作为“抽象层”,我们可以选择不关心

  1. WorkManager的工作类型
    还是用图解释比较清楚
    图片
  • 一次性任务
    就是随时发起的临时一次性任务

  • 长时间任务
    需要运行超过10分钟的任务,比如下载超大文件等

  • 定期任务
    如定期同步数据,时间同步等等

  • 简单实现

  1. 增加依赖
   def work_version = "2.8.0"
    // (Java only)
    implementation "androidx.work:work-runtime:$work_version"
  1. Worker定义
public class UploadWorker extends Worker {
   public UploadWorker(
       @NonNull Context context,
       @NonNull WorkerParameters params) {
       super(context, params);
   }

   @Override
   public Result doWork() {

     // Do the work here--in this case, upload the images.
     uploadImages();

     // Indicate whether the work finished successfully with the Result
     return Result.success();
   }
}

最最简单基础的Work
doWork方法只能写同步执行
最简单也最没啥用。如果真的是非常简单的执行问为啥兴师动众单独写出来,这不是悖论嘛

  • Result.success():工作成功完成。
  • Result.failure():工作失败。
  • Result.retry():工作失败,应根据其重试政策在其他时间尝试
  1. 生成WorkRequest
WorkRequest uploadWorkRequest =
   new OneTimeWorkRequest.Builder(UploadWorker.class)
       .build();

这里是最基本的一次性任务

  1. 添加任务
WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest);

到这里我们要写流程就结束了,后面交给“系统”自己去执行了

  • 总结预告

初次了解WorkManager上手还算比较简单,体系也比较全,算是Service的补充,只是现在这些功能还不足以满足“高级”的需求,
我在后面的章节里面补充

@soapgu soapgu changed the title WorkManager in Android WorkManager in Android 1 —— 初见 Aug 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant