首先区分一下电源管理, 电池管理和用电统计三个概念。
l 电源管理:前一篇文章讲的是电源管理, 电源管理的目的是节电, 让设备在空闲的时间进入睡眠状态。
l 电池管理: 电池管理的目的是对电池电量和状态的管理, 比如电量变化时和进入充电状态时更新任务栏上的进度条, 当系统低电量时通知用户, 电量低到一定程度时自动关机等。
l 用电统计:用电统计的目的则是统计系统中一些模块, 服务和应用程序的耗电情况, 并反馈给用户。
这篇文章是关于电池管理和用电统计的。
Android电池管理的功能其实很简单:
l 监测电池电量的变化并更新显示界面
l 监听进入充电状态和退出充电状态消息并更新界面
在BatteryService定义了UEventObserver, uevent是Linux内核用来向用户空间主动上报事件的机制,关于uevent请参见2.1.1.2节, JAVA中的UEventObserver就用来监听uevent的。
private UEventObserver mUEventObserver = new UEventObserver() { @Override public void onUEvent(UEventObserver.UEvent event) { update(); } }; |
然后调用mUEventObserver.startObserving("SUBSYSTEM=power_supply")只监听属性SUBSYSTEM 为“power_supply”的消息。 也就是说当系统进入充电状态和退出充电状态时, 电量变化时就会调用到这个onUEvent函数来处理变化。
UEventObserver的实现分为三层,
UEventObserver.java->android_os_UEventObserver.cpp->hardware\libhardware_legacy\uevent\uevent.c
l API层是com.android.os.UEventObserver
l JNI层是android_os_UEventObserver.cpp, 很浅
l Hal层是hardware\libhardware_legacy\uevent\uevent.c, 直接和内核通信
当第一次调用mUEventObserver.startObserving会启动一个UEventThread, next_event会返回监听到的uevent事件, 然后再判断是不是我们所关心的, 如果是就会回调我们注册的onUEvent函数。如下:
private static class UEventThread extends Thread { public void run() {
byte[] buffer = new byte[1024]; int len;</ |