Android的电源管理机制
Android的电源管理机制主要是通过锁和定时器来切换系统的状态。
一、Android的Linux内核kernel/power/suspend.c中也为系统提供了几种电源状态:
PM_SUSPEND_ON:设备处于全电源状态,也就是正常工作状态;
PM_SUSPEND_STANDBY:设备处于省电状态,但还可以接收某些事件,具体的行为取决与具体的设备;
PM_SUSPEND_MEM:低功耗状态,设备进入睡眠状态,但所有的数据还保存在内存中,只有某些外部中断才可以唤醒设备;
二、在Linux的Kernel底层针对低功耗状态也定义了几种不同的状态:
earlysuspend:可以让某些设备选择进入某种功耗较低的状态,比如LCD可以降低亮度或灭掉
suspend:除电源管理以外的其他外围模块和CPU均不工作,只有内存保持自刷新的状态
hibernation:所有内存镜像都被写入磁盘中,然后系统关机,重启后系统将能恢复到“关机”之前的状态
正常情况下,系统是先进入earlysuspend状态,在计时器到时间了无动作后,再进入suspend状态;hibernation状态不常见
三、正常的Android电源管理流程整体如下(个人理解,有误欢迎指出):
Android相比标准的Linux内核,在电源管理中加入了wake lock(电源锁)机制。
开机后:进入wake(唤醒)状态,计时器开始计时,在计时器计时期间如果如果有事件发生,则重置计时器;或者有APP申请了wake lock,则系统一直保持wake状态,除非用户按下了电源键。反之,如果没有任何事件发生,将进入earlysuspend状态-->suspend状态(期间会经过屏幕亮度降低,直到关闭)。
一些针对Android电源的开发:
代码对系统进行重启
5.1.1代码重启系统,经测可行:
PowerManager pm = (PowerManager)context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
pm.reboot(null);
5.1.1代码重启系统,未测
Intent iReboot = new Intent(Intent.ACTION_REBOOT);
iReboot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getActivity().startActivity(iReboot);
PowerManager
主要是用来控制电源状态的. 通过该类可以控制电池的待机时间,一般情况下不要使用。如果确实需要使用,那么尽可能的使用最低级别的WakeLocks锁。并且确保使用完后释放它。具体使用后面说明。先来说下该类的创建对象,使用如下代码
PowerManager pm = (PowerManager)context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
查看源代码可以看到PowerManager里面有六个方法
其中reboot()方法开篇就已经使用过,主要是用于重启,一般情况下,没什么特殊要求,字符串就不写,直接给null即可
剩下的几个方法,后面会有相应的介绍。
WakeLock(电源锁)介绍
WakeLock是Android提供给应用程序获取电力资源的唯一方法,只要还有地方在使用WakeLock,系统就不会进入休眠状态。由于是PowerManager的内部类,故创建对象需调用PowerManager的方法即可获得WakeLock对象。
PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,"My Tag");
wl.acquire();//获取该锁
//期间完成工作
wl.release();//释放该锁
这里需要提一点的是创建WakeLock对象时,flag参数的选择:有如下几种flag参数
flag值
CPU
Screen
Keyboard
说明
PARTIAL_WAKE_LOCK
开
关
关
不受电源键影响
SCREEN_DIM_WAKE_LOCK
开
开,暗(dim)
关
按下电源键立刻进入休眠状态
SSCREEN_BRIGHT_WAKE_LOCK
开
开,亮(bright)
关
FULL_WAKE_LOCK
开
开,亮(bright)
开
PROXIMITY_SCREEN_OFF_WAKE_LOCK
距离感应器锁,比如用在接听电话时,耳朵靠近听筒,屏幕熄灭
ACQUIRE_CAUSES_WAKEUP
正常情况下,获取WakeLock是不会唤醒机器,加上该标志后,就可以唤醒,比如用在来电提醒
ON_AFTER_RELEASE
该标记加上后,WakeLock释放后,系统会延迟一段时间后再黑屏,否则会立即黑屏
说到这里,回过头来再看PowerManager剩下的几个方法
newWakeLock():获取一个WakeLock对象
isWakeLockLevelSupported():判断某个级别是否是支持WakeLock级别
isScreenOn():已废弃,用isInteractive()
isInteractive():检查屏幕状态
reboot():重启,之前已有实例代码
isPowerSaveMode():检查是否是省电模式
电源管理之省电模式,性能模式切换
其实在PowerManager还有一个方法,只不过注解将其隐藏了,这个方法就是用于设置省电模式还是非省电模式,直接贴上该源码~
/**
* Set the current power save mode.
*
* @return True if the set was allowed.
*
* @see #isPowerSaveMode()
*
* @hide
*/
public boolean setPowerSaveMode(boolean mode) {
try {
return mService.setPowerSaveMode(mode);
} catch (RemoteException e) {
return false;
}
}