http://www.eoeandroid.com/thread-55899-1-1.html?_dsign=b33ca3f6
http://blog.csdn.net/u011311586/article/details/51034313
Android的电源管理部分,在纵向上分为四层:
第一部分:Application层
主要是利用Android Frameworks提供的API进行应用级的开发,需要注意的是相关权限的申明:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
第二部分:Frameworks层
1、frameworks/base/core/java/android/os/PowerManager.java
PowerManager:提供对设备的电源进行管理
WakeLock:电源管理对象锁
2、frameworks/base/core/java/android/os/Power,java
提供一些电源管理的函数,如reboot()。其是JNI的上层接口,其往下调用android_os_power.cpp
3.
/ frameworks/base/services/java/com/android/server/PowerManagerService.java
电源管理服务,AIDL接口IPowerManager的实现者。
(powermanagerservice.wakelocks:传入底层控制cpu唤醒状态
powermanagerservice.display:控制屏幕亮灭)
获取与PowerManager相关的本地服务,比如屏保(mDreamManager),屏幕显示(mDisplayManagerInternal),窗口策略(mPolicy),电池电量(mBatteryManagerInternal)等服务,然后初始化屏幕最大亮度,最小亮度,和默认亮度;
wakelock
Wakelock是android系统上特有的电源管理机制,只要有应用拿着这个锁,系统就不能进入睡眠状态,在上层不同的应用程序可以持有多个不同的wakelock锁,但是反映到底层就只有三种:控制系统休眠PowerManagerService.WakeLock,控制屏幕显示的PowerManagerService.Display和控制电源状态改变通知的PowerManagerService.Broadcasts。
PowerManagerService有加锁和解锁两种状态,加锁有两种方式:
第一种是永久的锁住,这样的锁除非显式的放开,否则是不会解锁的,所以这种锁用起来要非常的小心(默认)。
第二种锁是超时锁,这种锁会在锁住后一段时间解锁。
电源状态更新,最重要的标志变量为mDirty,当与电源相关的状态改变,都会通过置位的方法反映在mDirty集合变量了,比如充电状态,屏幕亮度,电源设置,唤醒状态等发生改变都会在mDirty中反映出来
[-->PowerManagerService.java::userActivity]
public voiduserActivity(long time, boolean noChangeLights) {
......//检查调用进程是否有DEVICE_POWER的权限
userActivity(time, -1, noChangeLights, OTHER_EVENT, false);
}
此处将调用另外一个同名函数。注意第三个参数的值OTHER_EVENT。系统一共定义了三种事件,分别是OTHER_EVENT(除按键、触摸屏外的事件)、BUTTON_EVENT(按键事件)和TOUCH_EVENT(触摸屏事件)。它们主要为BatteryStatsService进行电量统计时使用,例如触摸屏事件的耗电量和按键事件的耗电量等。
第三部分:JNI层
/frameworks/base/core/jni/android_os_power.cpp
第四部分:Native层
/hardware/libhardware/power/power.c
与Linux kernel交互
第五部分:Linux驱动层
/drivers/android/power.c
第六部分:使用电源管理注意事项
1.
可在onCreate时设置该界面的电源管理,在onDestroy时取消设置
2.
可在onResume时设置该界面的电源管理,在onPause时取消设置
3.
注意设置是以Activity为单位,不是以应用为单位
4.
注意在AndroidManifest.xml中声明该应用有设置电源管理的权限
5.
注意加锁解锁要成对出现
6.
注意多个用途最好用多个锁,不要一锁多用,以免出错
7.
注意对运行在后台和异常时对锁的处理
8.
注意在网络连接或传输时最好加锁,以免传输被中断
9.
注意加锁以保证程序逻辑
第七部分:参阅资料
1.http://jaymsimusic.javaeye.com/blog/764629
2.http://www.rosoo.net/a/201012/10599.html