Android电源模式开发

2019-07-13 21:37发布

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; } }