Android电源管理
相关source文件
�6�1 frameworks\base\core\java\android\os\PowerManager.java 被APP调用,控制电源状态等 frameworks\base\services\java\com\android\server\PowerManagerService.java 统一管理各应用通过PowerManager类传来的请求,PowerManager类接口的实际实现 。 frameworks\base\core\java\android\os\IPowerManager.aidl 定义了给各Client调用 的PowerManagerService接口。 frameworks\base\core\java\android\os\Power.java Power与jni接口交互 frameworks\base\core\jni\android_os_power.cpp 此文件是PowerManager的jni接口实现
�6�1
�6�1
�6�1
�6�1
�6�1
hardware\libhardware\power\power.c PowerManager的HAL代码,与电源管理的kernel交互
用来控制电源状态的类 ——android.os.PowerManager类
一个子类android.os.PowerManager.WakeLock App通过获取WakeLock对象、设置WakeLock的属性,来控制 电源设备的状态。 �8�7 获取WakeLock (例) -----------�8�7
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | ON_AFTER_RELEASE, TAG); wl.acquire(); //请求锁 //…screen will stay on during this section.. wl.release(); //释放锁
------------
用来控制电源状态的类 ——android.os.PowerManager类
�8�7
WakeLock的状态及flag
Cpu PARTIAL_WAKE_LOCK SCREEN_DIM_WAKE_LOCK SCREEN_BRIGHT_WAKE_LOCK FULL_WAKE_LOCK On* On On On Screen Off Dim Bright Bright Board Off Off Off Bright
�8�3 状态
�8�3 Flag
ACQUIRE_CAUSES_WAKEUP: 大多数情况下的锁只能保持屏幕亮的状态,而不能点 亮屏幕。如果添加这个flag,会立即点亮屏幕。 ON_AFTER_RELEASE: 设置了这个flag的锁在释放的时候会重置 PowerManagerService的Timer,可以减少闪屏的发生。在设置了 PARTIAL_WAKE_LOCK时,不起作用。 注:只是重置Timer,如果release屏幕的时候屏幕是off,那么将不能点亮屏幕。
用来控制电源状态的类 ——android.os.PowerManager类
�8�7
重要的public方法
�8�3 public WakeLock newWakeLock(int flags, String tag) 获取一个WakeLock对象 �8�3 public void userActivity(long when, boolean noChangeLights) 设备切换到fullon的状态,同时重置PowerMangerService的Timer �8�3 public void goToSleep(long time) 强制设备进入休眠状态。但如果申请了PARTIAL_WAKE_LOCK,手机将不 会休眠 �8�3 public void setBacklightBrightness(int brightness) �8�3 public int getSupportedWakeLockFlags() �8�3 public boolean isScreenOn() �8�3 public void reboot(String reason)
电源管理的核心 —— PowerManagerService
�8�7 �8�7
�8�7
PowerManager类是基于IPowerManager.aidl实现的。 真正实现的代码都在PowerManagerService.java中。 PowerManagerService负责处理所有的WakeLock(包括来自系 统和APP),以及用户行为,以及所有和屏幕键盘亮度相关的其 他处理(P-Sensor和Light-Sensor)。 以下几种方法可以改变屏幕on-off状态: App通过WakeLock;用
户通过用户事件,按 Power,Menu,Back键等(多数调用UserActivity);系统通过 PowerManager的Timer;其他(使P-sernsor生效等)
电源管理的核心 —— PowerManagerService
PowerManagerService的主要线程
mTimeoutTask 当主要记录用户行为的Timer超时时,将用户行为状态与WakeLock总状态取或,设 置电源状态。 mNotificationTask 在屏幕on-off切换时,通知PhoneWindowManager执行锁屏等操作。 mForceReenableScreenTask PowerManagerService提供的preventScreenOn方法将阻止屏幕被点亮,解决一些 闪屏问题,当这个方法被调用时,开始计时,超时时间是5秒,5秒后调用此线程, 使Screen能够处理其他点亮屏幕的请求。 mProximityTask P-Sensor相关。 Light Animator 这个真不知道 mAutoBrightnessTask 看标题猜吧
电源管理的核心 —— PowerManagerService
自动挂起锁屏流程
1.PowerManagerService.java中mTimeoutTask超时,设置屏幕为SCREEN_OFF状态, 启动mNotificationTask线程。 2. mNotificationTask调用 policy.screenTurnedOff(why),通知屏幕off。 3.PhoneWindowManager.java中screenTurnedOff() 方法被调用,执行 mKeyguardMediator.onScreenTurnedOff(why); 4.KeyguardViewMediator.java中onScreenTurnedOff(int why) 锁住屏幕流程 onScreenTurnedOff大概流程: 如果屏幕已锁,则。。。(没细看) 否则如果why=Timeout,则注册两个intent,5秒之内有event,发送 FLAG_CANCEL_CURRENT intent, 否则发送DELAYED_KEYGUARD_ACTION intent。 如果DELAYED_KEYGUARD_ACTION被接收到,调用dokeyguard(),从 powermanager请求锁 然后执行锁屏动作,再释放PowerManager的锁