Android电源管理分析

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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值