Android实现后台任务

时间:2024-03-20 19:19:39

在什么条件下,Android App才会处于后台状态呢?

一个app处于后台,只有在除以下case之外的情况发生时:

  • App有一个可见的Activity(无论activity处于start/pause状态);
  • App有一个前台Service;
  • 有另一个前台应用与指定app有关联(绑定该app的一个Service,抑或使用它的ContentProvider)。例如,当一个app在前台,如果另一个app绑定到它的:

A. IME(InputMethodService);

B. Wallpager Service;

C. Notitfication listener;

D. Voice(VoiceInteractionService)/text(android.service.textservice)Service;

E. 当音频流传到传输到汽车时的音乐播放app。

而当以上任一情况为true,我们认为app处于前台。

 

后台任务的变化

为了改善电池的寿命同时提高用户体验,在最近的几个release版本中,android都采取了一系列措施来限制后台任务。这些限制包括:

  • Doze & App Standby。当设备锁屏,同时设备空闲且没有充电时,会限制app的行为;
  • Background Location restrictions。当app处于后台时会限制其访问用户当前位置信息的频率;
  • Background Service limits。阻止后台服务以用户无感知的方式运行并消耗cpu/网络。
  • 在最新的android版本(android 9.0)中,提出了App Standby Buckets和App Restrictions等省电策略。App Standby Buckets会根据用户的使用习惯来限制app对设备资源的访问,App Restrictions会检测:当app出现问题,会限制其对系统资源的占用。

用例及解决方案

最终决定使用哪一种工具来实现后台任务需要开发人员对他们想要实现扥功能以及android系统的限制有一清晰的了解。下面的数据流图可以帮助大家做决策:

 

 

Android实现后台任务

数据流图: 后台任务用例及解决方案

 

  • WorkManager。WorkManager是一个比较推荐的后台任务方案,它的内部考虑到了所有Android OS级别的限制。如果你需要保证任务执行,即使发生了延期,你需要选择WorkManager。改API允许你安排作业(一次或重复)、链接和组合作业。你也可以申请在设备空闲、支付计费或ContentProvider改变时触发任务。WorkManager的另一个有意思的功能时它遵循了电源管理功能,因此,当一个任务将开始运行时恰好设备处于Doze状态,哎接触Doze状态或维护时段(即maintenance window)到达时,WorkManager将会尝试运行任务。
  • Firebase Cloud Messaging。如果要安排长时间运行的任务以响应外部事件(如同步新的在线内容),可以使用Firebase Cloud Messaging,然后,使用WorkManager来同步内容。
  • Foreground Servie。如果你想要执行一个用户提交的任务,即使用户离开app或锁屏都不能推迟,你应该选择Foreground Service,例如音频/视频播放或导航。
  • AlarmManager。如果你想要在准确的时间触发一个任务,这个任务涉及交互且无法延迟,请使用AlarmManager(更具体的说,使用方法setExactAndAllowWhileIdle())。闹钟有关的例子包括:

1. 提醒用户吃药;

2. 提醒用户某个电视节目开始的通知。

当一个闹钟触发,你将有较少的时间来完成作业,同时你的app可能禁止访问网络的(例如,在Doze /App Standby buckets状态)。如果你想要访问网络或执行一个耗时任务,请使用WorkManager。每当一个唤起闹钟被触发,设备都会退出低功耗模式并保持在【partial wake lock 】状态,这会影响电池的寿命。这个问题可以通过Android Vitals(Google play平台)来监控。

 

总结

WorkManager当前仍然处于preview版本。如果你想要一个替代方案,请使用JobScheduler(虽然它有一些限制不如WorkManager)。JobScheduler也是android framework层的一部分,但它仅仅在api-21版本以上有效;而WorkManager在api-14版本以上都是有效的。