Android 后台任务
我们知道,在Android应用开发的过程中,不能在主线程中处理耗时任务,否则会导致UI卡顿,甚至ANR,非常影响用户体验,这就需要把这些耗时的任务,转移到后台去运行。
主线程工作
- 更新UI(包括测量和更新View)
- 协调用户交互
- 接收生命周期事件
以下操作需要在独立的线程里面
- 处理图片资源
- 访问磁盘,读写文件
- 处理网络请求
- 任何其他耗时达到几百毫秒的操作
- 当应用没有运行在前台,并且要在后台同步数据的时候
后台应用挑战
- 后台应用会消耗设备的有限的资源,比如RAM和电池,这个可能会给用户带来不好的体验
- 为了最大化电池的使用,Android系统会强制限制后台应用程序
- Android 6.0,引入了Doze 和 App standby
- Android 7.0,限制隐式广播和引入Doze-on-the-Go
- Android 8.0, 限制后台行为,比如定位和Wekelocks
- Android 9.0, 引入App Standby Buckets
如何选择合适的方案
- 任务是否可以延迟,还是需要立刻执行?
- 独立工作还是依赖系统环境?
- 是否需要精确定时运行?
Google推荐的方案
- WorkManager
- Android Libraries (API Level 14+)
- Forground Service
- 告知用户正在处理的重要内容
- 前台服务是可见的
- AlarmManager
- 定时任务
- DownloadManager
- HTTP长连接