Android的电池的管理
来源:互联网 发布:淘宝网如何货到付款 编辑:程序博客网 时间:2024/04/29 07:56
Android battery supply
Eric_Zhu
Android的电池的管理分为三个部分:Java部分,JNI部分以及kenel部分。
1.Java部分主要是BatteryService,作为电池及充电相关的服务,它的主要功能就是监听power_supply的uenvnt事件,读取sysfs中电池信息,然后通过intent广播给所有相关Activity。
源代码路径如下:
android_froyo/frameworks/base/services/java/com/android/server/BatteryService.java
BatteryService中实现了一个UEvent的观察者。uevent是Linux内核用来向用户空间主动上报事件的机制,对于JAVA程序来说,只实现UEventObserver的虚函数onUEvent,然后注册即可。
mUEventObserver.startObserving("SUBSYSTEM=power_supply");
当有power_supply相关的事件上报时,就会调用update函数。
update先调用native_update从sysfs中读取相关状态。
update然后根据读到的状态更新BatteryService的成员变量,并广播一个Intent来通知其它关注电源状态的组件。
private final void sendIntent() {
...........
2.JNI部分提供接口给上层的battery_service.java调用,直接读取设备文件,取得信息后,用来更新battery状态。源代码路径如下:
android_froyo/frameworks/base/services/jni/com_android_server_BatteryService.cpp
com_android_server_BatteryService.cpp中主要实现了android_server_BatteryService_update函数,即Java层的BatteryService中调用的native_update函数,它直接读取设备文件。
static void android_server_BatteryService_update(JNIEnv* env,jobject obj)
{
setBooleanField(env, obj, gPaths.acOnlinePath,gFieldIds.mAcOnline);
...............
const int SIZE = 128;
char buf[SIZE];
if(readFromFile(gPaths.batteryStatusPath, buf, SIZE) >0)
env->SetIntField(obj, gFieldIds.mBatteryStatus,getBatteryStatus(buf));
else
env->SetIntField(obj,gFieldIds.mBatteryStatus,
gConstants.statusUnknown);
if(readFromFile(gPaths.batteryHealthPath, buf, SIZE) >0)
env->SetIntField(obj, gFieldIds.mBatteryHealth,getBatteryHealth(buf));
if(readFromFile(gPaths.batteryTechnologyPath, buf, SIZE)> 0)
env->SetObjectField(obj,gFieldIds.mBatteryTechnology,env->NewStringUTF(buf));
}
static JNINativeMethod sMethods[] = {
{"native_update", "()V",(void*)android_server_BatteryService_update},
};
3.kernel部分又可分为两部分:power_supply_core以及具体芯片的battery driver。
power_supply_core部分的源代码路径:
trunk/android_froyo/kernel/common/drivers/power/power_supply_core.c
trunk/android_froyo/kernel/common/drivers/power/power_supply_sysfs.c
battery driver(bq27541)部分的源代码路径:
android_froyo/kernel/common/drivers/power/bq27x00_battery.c
power_supply_core主要提供统一设备文件的创建以及发送power_supply相关的uevent;battery driver主要提供具体的电池信息。
以bq27541电池芯片为例,首先要注册i2c驱动,在zylonite_pxa300.c文件中声明bq27541芯片的type以及i2c地址,使用i2c_add_driver(&bq27x00_battery_driver)注册驱动时会调用bq27x00_battery_probe函数,该函数中完成i2c设备的探测,充放电中断的申请以及设备文件的创建。
每当产生充放电中断时,驱动会调用中断函数ext_power_isr,该函数调用power_supply_core的power_supply_changed(&(di->bat))函数,发送一个power_supply属性的uevent,Java层的BatteryService接收到该事件后就会调用JNI层的native_update函数来获得电池信息,然后通过intent广播给相应的activity。
由于电池电量变化时不能产生中断来通知上层读取电池信息,所以设置了一个定时器,每隔30s发送一个uevent事件让BatteryService来读取电池信息是否有变化。
- Android的电池的管理
- 用android的GCM 网络管理来优化电池使用时间
- Android系统应用---SystemUI之三:状态栏电池图标的显示和Android电池管理的探讨
- android电池管理
- Android-statuabar电池管理
- Android电池管理
- android电池管理系统
- android BatteryManager电池管理
- android电池管理系统
- android电池管理系统
- android电池管理系统
- Android 电池管理系统
- Android 电池管理系统
- Android 电池管理系统
- Android 电池管理
- Android 电池管理系统
- Android电池状态的监听
- Android电池状态的监听
- HDU 3790 最短路径问题 (双重权值) dp
- js中将字符串转换成json的三种方式
- HTML URL 字符编码
- JNDI 笔记
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
- Android的电池的管理
- 无线网卡的AP和STA模式
- HDU-1106 快排模板 和 基数排序
- ASP.NET 2.0 本地化技术之研究
- java 多线程 等待返回
- JAVA 创建TXT文件,写入文件内容,读取文件内容
- 简化ajax的使用之DWR学习
- Multi-Byte Character Set & Use Unicode Character Set
- SQL SERVER 关于日期函数(字符转日期,日期转字符串)