Android电源模式开发

来源:互联网 发布:cds测试软件7.1 编辑:程序博客网 时间:2024/06/06 19:09
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值CPUScreenKeyboard说明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;        }    }













0 0