原文地址:magdamiu.com/2019/09/22/…
作者:MAGDA MIU
到目前为止,为了在安卓系统中执行后台工作,开发人员必须在多个执行选项中进行选择。在2018年谷歌I/O上,安卓团队推出了工作管理器,*作为*安卓Jetpack的一部分。
这个库提供了一个简单干净的界面来指定可推迟的异步任务以及它们应该何时运行。这篇博客文章是关于工作管理器的新系列中的第一篇。该系列将包括关于安卓内存模型、现有背景解决方案、幕后发生的事情以及我们为什么和何时应该使用工作管理器的概述。
此外,我们还将发现有关Work Manager库的体系结构及其主要组件(Worker、Work Request、Work Manager、Work Info)的详细信息。最后,我们将重点介绍如何在以下场景中使用Work Manager:按指定顺序运行的任务链式序列、唯一命名序列、传递和返回值的任务以及如何应用约束来决定何时运行任务。
在这篇博客文章中,我将涵盖:
-
安卓内存模型
-
安卓电池优化
-
当前的后台处理解决方案
-
Work Manager在后台工作模式中的位置
在移动领域,应用程序的性能对用户保留有重要影响。但是哪些问题会让用户不开心呢?就我个人而言,我已经确定了两个可能让用户不开心的主要问题:
-
快速耗尽的电池
-
内存耗尽的电话
研究表明,关于:
-
**53%**的用户卸载或删除了存在崩溃、冻结或错误等严重问题的移动应用
-
36%的人会因为大量使用电池而停止使用移动应用。
这就是为什么移动应用的性能应该受到重视。
Android内存模型
作为一名安卓开发者,我了解到当我开发一个应用程序时,它不是关于我,而是关于将与我构建的应用程序交互的用户。所以这都是关于安卓生态系统的,因为安卓是为每个人准备的。我说的安卓生态系统是什么意思?
-
应用程序
-
器件
-
用户
就设备而言,它们可以根据配置分为三大类。所以我们有入门级设备、中档设备和高级设备。
当我们谈论内存可用性和使用率时,我们应该更多地关注入门级设备,因为高端和中档设备有很好的内存配置。如果我们不构建能够在入门级设备上正常工作的应用程序,那么这些设备将停止生产,基于这一点,我们的大部分用户也将消失。这不是一件好事。这些用户会失望的。
在设备上,物理内存是按页组织的,每页大约有4千字节。这些页面可以有三种主要状态:使用页、缓存页和空闲页。
如果我们一开始就把一个设备置于内存压力之下,我们会有一些空闲的可用存储器,所以我们有一个快乐的设备,因为如果一个应用程序需要内存,我们有足够的内存。随着时间的推移,因为我们使用了更多的内存,空闲内存会减少,在这种情况下,Linux内核有一个叫做ksw apd的机制,它的工作是寻找更多的空闲内存。这个过程的主要操作是回收缓存的页面。这个操作需要一些时间来重新加载缓存的页面,但是用户看不到。
我们继续使用设备内存,缓存页面的数量也开始下降,系统开始崩溃,这是一件坏事。这时,低内存杀手出现并开始杀死正在运行的进程。这对内存来说是件好事,但它可能会影响用户当前使用的应用程序。
安卓电池优化
关于电池优化Android在最新版本中提供了电池节省功能,如:
-
在棉花糖中,引入了深度打盹模式——在设备不动的情况下,设备处于深度睡眠状态——关闭背景活动
-
在牛轧糖中*——在*旅途中打瞌睡——让设备睡得更轻松,更频繁地醒来,检查是否有悬而未决的工作要做(关闭部分背景工作)
-
在奥利奥,他们被引入了后台服务的限制
-
在Android Pie中——基于应用程序待机的自适应电池——应用程序被移动到4个桶中(活动的、工作的、频繁的和罕见的)
背景处理解决方案
多年来,谷歌提供了各种方法,让开发者在后台协助做或调度工作。
-
JobScheduler是一个很棒的新API,但仅支持Android棒棒糖(API 21)及以上版本
-
Firebase Jobs Dispatcher与Ice Cream Sandwich(API 15)向下兼容——但它需要Google Play服务,该服务又大又重,在中国不可用。从明年,也就是2020年4月开始,它将被存档。目前它已被弃用。
-
警报管理器适用于所有应用编程接口级别,但需要广播接收器才能在设备重启后存活下来,并且还受到一些电源管理器限制,这些限制已在安卓派中引入。
所以看起来我们可以选择排除旧设备,还是从头开始做几个小时的工作。
组织背景解决方案的一个好方法是根据时间和重要性对它们进行拆分:
-
纵轴是工作的时间:工作应该在指定的时候完成,或者可以等一会儿。
-
横轴表示工作的重要性。它应该在应用程序处于前台或需要在某一点完成时完成。
工作经理
Work Manager是第四类任务的一部分,这些任务可以推迟,但需要执行。
“Work Manager是一个管理可推迟和有保证的后台工作的库。”
可推迟的工作:任务可以稍后运行,并且仍然有用(上传日志vs发送消息)
保证:任务将运行,即使应用程序将被关闭或设备重启(备份图像到服务器)
为什么使用Work Manager?
-
与不同操作系统版本的向后兼容(API级别14+)
-
遵循系统健康最佳实践
-
支持一次性和周期性任务
-
支持input/output的链式任务
-
定义任务何时运行的约束
-
保证任务执行,即使应用程序或设备重新启动
何时使用Work Manager?
-
定期提取数据
-
上传images/files到服务器
-
在应用程序和服务器之间同步数据
-
向服务器发送日志
-
对数据执行昂贵的操作
在下一篇文章中,我们将深入研究每个工作管理器实体,并研究它们如何应用于我们的代码。敬请关注!
现在就这样,希望有帮助!如果有什么不清楚的或者你有问题,请尽情享受并随时留言。谢谢你的阅读!