导言


    安卓作为一个移动设备的操作系统,在设计之初就考虑了省电的功能特性。 在设计Android系统时,开发团队研究了在可预见的将来哪些移动设备限制可能不会改变的问题。
    首先被考虑的是,移动设备由电池供电,电池性能可能不会很快得到改善。
    从一开始就考虑了这些限制,并在整个安卓框架设计中得到了充分的考虑,所以这个方案让安卓有了更好的用户体验。
    这篇文章主要讲到的就是关于用户App在与安卓系统的省电机制,和对应用的影响。

    早期的安卓应用有很多办法可以在后台运行,导致系统耗电量增加,很大程度上减少了手机待机时间。
    所以省电机制势必会影响一部分应用的运行。

    应用生命周期


    对于安卓系统来说,主要的电池消耗来源于点亮屏幕和CPU运行,存储单元的使用一般也与CPU使用有关。 还有一些外部设备例如wifi、3G、4G,摄像头会产生耗电,但这些外部设备在不用的时候可以关闭。屏幕的电量消耗只能通过硬件的优化解决,所以CPU运行是安卓系统层面主要考虑的省电因素。
    CPU的运行与消耗电量,只发生在有CPU执行编码的时候。

    在一个安卓应用的生命周期之内,对于一个用户应用来说在系统中位于前台运行的时候是CPU使用权限最高的时候。从onStart、onResume到 onPause、onStop之间,也就是Activity running期间。
    在这个期间应用占据了整个屏幕,所以对用户的响应要求也最高,CPU使用的优先级也响应最高。

    image.png

    但是一旦安卓应用从屏幕上被切走,运行的权限便到了别的安卓应用,或者桌面这种系统应用上。
    而我们的安卓应用的Activity 进入暂停状态,程序到了后台运行的阶段。

    后台运行


    安卓程序有以下几种方式可以在后台运行。

    Service

    安卓应用程序可以注册一个Service,以便其在后台运行

    JobScheduler

    Broadcaster Reviever + AlarmManger

    移动推送( GCM

    系统运行态


    休眠模式(Sleep Mode)
    睡眠模式意味着CPU将处于睡眠状态,除了RIL(无线电接口层)和Alarm之外,将不接受任何CPU命令。
    LCD屏幕关闭后,CPU将在几秒钟内进入睡眠模式。

    Doze Mode
    Doze模式意味着您手机上的应用程序将无法访问网络,
    当应用程序试图阻止设备进入Doze状态时,系统将忽略“唤醒锁”,并且不允许后台任务运行。

    这肯定听上去会使您的手机没什么好用得,但是Doze保留了几种功能的使用。
    尽管应用无法唤醒设备以运行同步作业和其他后台任务,但仍会显示高优先级的推送消息。
    因此,例如,即时聊天消息将出现在处于Doze 模式的设备上。

    App Standby
    进入待机状态的应用将失去所有网络访问权限,并且其所有后台同步作业都将被暂停。
    手机插入充电器后,这些限制会暂时解除,每一到两天有这么几分钟时间。
    这使已暂停的应用有机会运行所有待处理的同步操作,但不允许它们继续运行。
    高优先级的推送通知还可以将应用从待机状态唤醒一小段时间。