前言

当我们的App正在与用户频繁交互时,需要处理某个耗时任务,而任务的结果需要立即反馈。这时因为主线程用于处理UI和用户交互逻辑,如果有太多的耗时的逻辑在主线程中执行,就会阻塞主线程,引发ANR异常,导致APK卡顿甚至崩溃。因此需要一个后台线程来处理耗时任务。

当我们的App并未与用户频繁交互,但是,App本身需要周期性的从服务器同步数据或者获取数据(常见的心跳连接、收发消息长连接)。这时需要一个后台进程来处理,因为仅仅是后台线程,不能保证长久存活,也不能保证任务能执行完毕。

关于进程保活的文章有很多了,推荐几篇不错的文章:
腾讯——张兴华 原文链接找不到了,这是别人转发
关于 Android 进程保活,你所需要知道的一切

但是,官方说明自己看:

Note: You should only use a foreground service for tasks the user expects the system to execute immediately or without interruption. Such cases include uploading a photo to social media, or playing music even while the music-player app is not in the foreground. You should not start a foreground service simply to prevent the system from determining that your app is idle.

本文的目的在于参考官方文档,解决后台进程处理的相关问题,未必要保活。

一、低电耗(Doze)模式

Doze会通过推迟应用程序的后台CPU和网络活动来减少电池消耗。

系统会定期退出Doze一段时间,让应用程序完成延期活动。在此维护窗口期间,系统将运行所有挂起的同步,作业和警报,并允许应用程序访问网络。

在每个维护窗口结束时,系统再次进入Doze,暂停网络访问并推迟作业,同步和警报。随着时间的推移,系统会越来越少地安排维护窗口,有助于在设备未连接到充电器时长时间不活动时减少电池消耗。

一旦用户通过移动设备,打开屏幕或连接充电器唤醒设备,系统退出Doze并且所有应用程序恢复正常活动。

功能限制

在低电耗模式下,您的应用会受到以下限制:

  • 暂停访问网络。
  • 系统忽略唤醒锁定。
  • 标准 AlarmManager 闹钟(包括 setExact()setWindow())推迟到下一个维护期。
  • 如果您需要设置在设备处于低电耗模式时触发的闹钟,请使用 setAndAllowWhileIdle()setExactAndAllowWhileIdle(),但9分钟内只能触发一次闹钟。使用 setAlarmClock() 设置的闹钟将继续正常触发,系统会在这些闹钟触发之前不久退出低电耗模式。
  • 系统不执行 WLAN 扫描。
  • 系统不允许运行同步适配器。
  • 系统不允许运行 JobScheduler。

adb指令强制进入Doze模式

$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step  切换到下一个状态,idle和active状态之间切换
$ adb shell dumpsys deviceidle -h 查看帮助
$ adb shell dumpsys deviceidle force-idle [light|deep]  强制进入idle状态
$ adb shell dumpsys deviceidle force-inactive  强制进入inactive状态
$ adb shell dumpsys deviceidle unforce  强制解除idle、inactive状态,进入active状态
$ adb shell dumpsys deviceidle get [light|deep|force|screen|charging|network] 获取相应的当前状态
$ adb shell dumpsys battery reset 复位默认值,恢复设备激活状态。
复制代码

二、应用待机模式(App Standby)

App Standby推迟用户最近未与之交互的应用的后台网络活动。

adb指令强制进入standby模式

$ adb shell dumpsys battery unplug
$ adb shell am set-inactive 

GankRobot转载声明

原文出处:掘金Androidd

原文作者:hdib

原文地址:https://juejin.im/post/5d5fec66518825462823696b