`

Android之 BatteryService

 
阅读更多

电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。BatteryService是跑在system_process当中,在系统初始化的时候启动,如下

在BatteryService.java中:
Log.i(TAG, "Starting Battery Service.");
BatteryService battery = new BatteryService(context);
ServiceManager.addService("battery", battery);
========================================================================================
1. 数据来源
BatteryService通过JNI(com_android_server_BatteryService.cpp)读取数据。BatteryService通过JNI注册的不仅有函数,还有变量。 如下:

//##############在BatteryService.java中声明的变量################
private boolean mAcOnline;
private boolean mUsbOnline;
private int mBatteryStatus;
private int mBatteryHealth;
private boolean mBatteryPresent;
private int mBatteryLevel;
private int mBatteryVoltage;
private int mBatteryTemperature;
private String mBatteryTechnology;

//在BatteryService.java中声明的变量,在com_android_server_BatteryService.cpp中共用,即 在com_android_server_BatteryService.cpp中其实操作的也是BatteryService.java中声明的变量

gFieldIds.mAcOnline = env->GetFieldID(clazz, "mAcOnline", "Z");
gFieldIds.mUsbOnline = env->GetFieldID(clazz, "mUsbOnline", "Z");
gFieldIds.mBatteryStatus = env->GetFieldID(clazz, "mBatteryStatus", "I");
gFieldIds.mBatteryHealth = env->GetFieldID(clazz, "mBatteryHealth", "I");
gFieldIds.mBatteryPresent = env->GetFieldID(clazz, "mBatteryPresent", "Z");
gFieldIds.mBatteryLevel = env->GetFieldID(clazz, "mBatteryLevel", "I");
gFieldIds.mBatteryTechnology = env->GetFieldID(clazz, "mBatteryTechnology", "Ljava/lang/String;");
gFieldIds.mBatteryVoltage = env->GetFieldID(clazz, "mBatteryVoltage", "I");
gFieldIds.mBatteryTemperature = env->GetFieldID(clazz, "mBatteryTemperature", "I");



//上面这些变量的值,对应是从下面的文件中读取的,一只文件存储一个数值。


#define AC_ONLINE_PATH "/sys/class/power_supply/ac/online"
#define USB_ONLINE_PATH "/sys/class/power_supply/usb/online"
#define BATTERY_STATUS_PATH "/sys/class/power_supply/battery/status"
#define BATTERY_HEALTH_PATH "/sys/class/power_supply/battery/health"
#define BATTERY_PRESENT_PATH "/sys/class/power_supply/battery/present"
#define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/capacity"
#define BATTERY_VOLTAGE_PATH "/sys/class/power_supply/battery/batt_vol"
#define BATTERY_TEMPERATURE_PATH "/sys/class/power_supply/battery/batt_temp"
#define BATTERY_TECHNOLOGY_PATH "/sys/class/power_supply/battery/technology"

Android是运行在Linux内核上面的,/sys/class/power_supply亦是Linux内核下面的目录。至于这些文件时怎么生成的,则是由Platform来控制的。

-----------------------------------------------------------------------------------------------------------------------------------
2. 数据传送
电池的这些信息是通过何种方式,被其他应用所获得的。可以想到的有两种方式,第一种,应用主动从BatteryService获得数据;第二种,BatteryService主动把数据传送给所关心的应用程序。

BatteryService采用的是第二种方式,所有的电池的信息数据是通过Intent传送出去的。在BatteryService.java中,Code如下:

Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);

intent.putExtra("status", mBatteryStatus);
intent.putExtra("health", mBatteryHealth);
intent.putExtra("present", mBatteryPresent);
intent.putExtra("level", mBatteryLevel);
intent.putExtra("scale", BATTERY_SCALE);
intent.putExtra("icon-small", icon);
intent.putExtra("plugged", mPlugType);
intent.putExtra("voltage", mBatteryVoltage);
intent.putExtra("temperature", mBatteryTemperature);
intent.putExtra("technology", mBatteryTechnology);

ActivityManagerNative.broadcastStickyIntent(intent, null);

-----------------------------------------------------------------------------------------------------------------------------------
3. 数据接收
应用如果想要接收到BatteryService发送出来的电池信息,则需要注册一个Intent为Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver。

注册方法如下:
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(mIntentReceiver, mIntentFilter);

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {

int nVoltage = intent.getIntExtra("voltage", 0);
if(nVoltage!=0){
mVoltage.setText("V: " + nVoltage + "mV - Success...");
}
else{
mVoltage.setText("V: " + nVoltage + "mV - fail...");
}
}
}
};

-----------------------------------------------------------------------------------------------------------------------------------
4. 数据更新
电池的信息会随着时间不停变化,自然地,就需要考虑如何实时的更新电池的数据信息。在BatteryService启动的时候,会同时通过UEventObserver启动一个onUEvent Thread。

每一个Process最多只能有一个onUEvent Thread,即使这个Process中有多个UEventObserver的实例。当在一个Process中,第一次Call startObserving()方法后,这个UEvent thread就启动了。
而一旦这个UEvent thread启动之后,就不会停止。

//在BatteryService.java中
mUEventObserver.startObserving("SUBSYSTEM=power_supply");

private UEventObserver mUEventObserver = new UEventObserver() {
@Override
public void onUEvent(UEventObserver.UEvent event) {
update();
}
};


在UEvent thread中会不停调用 update()方法,来更新电池的信息数据。


-----------------------------------------------------------------------------------------------------------------------------------
5. 附录相关文件:
(1). SystemServer.java (frameworks/frameworks/base/services/java/com/android/server)
(2). BatteryService.java (frameworks/frameworks/base/services/java/com/android/server)
(3). UEventObserver.java (frameworks/frameworks/base/core/java/android/os)
(4). com_android_server_BatteryService.cpp (frameworks/frameworks/base/services/jni)

分享到:
评论

相关推荐

    Android BatteryService学习文档

    标题:“Android BatteryService学习文档” 描述分析:这份文档深入探讨了Android框架中与电池管理相关的知识,特别是BatteryService的工作机制。BatteryService是Android系统服务的一部分,负责监控和报告设备的...

    Android编程之电池电量信息更新的方法(基于BatteryService实现)

    `BatteryService`是Android系统的核心服务之一,它负责收集电池的各种状态信息,包括但不限于电池电量、电压、温度、充电状态等。这个服务运行在`system_process`进程中,当系统启动时由`SystemServer`进行初始化。...

    Android-电池管理-实时获取电池电量,温度...等属性。

    实现一个电池属性实时监听器。这些属性包括温度,电池电量.......而且,使用Service,Broadcast,以及Thread的方式来实现。MyBatteryService后台获取Battery属性值,然后,在Activity中进行相关数据的显示。

    BatteryService

    BatteryService 是android中提供电源管理的类(Android 4.1.2)

    Android应用源码battery(电池)监控程序.zip

    "Android应用源码battery(电池)监控程序.zip"提供了一种实现电池状态监控的方法,这可以帮助开发者了解应用对电池寿命的影响,优化应用性能,或者创建专门的电池管理工具。下面,我们将深入探讨Android电池监控的...

    基于Android的battery(电池)监控程序.zip

    通过调用`Context.getSystemService(BATTERY_SERVICE)`方法获取BatteryManager实例,然后通过对应的常量(如BATTERY_LEVEL、BATTERY_STATUS等)查询电池状态。 其次,为了实时监控电池状态,可以注册...

    android手机电量显示源代码

    在系统服务层面,Android有一个名为`BatteryService`的服务,它负责定期查询Power HAL获取电池信息,并将其更新到系统广播中。`BatteryService`是系统关键服务,位于`frameworks\base\services\core\java\...

    android 电池管理

    在深入探讨Android电池管理的核心机制之前,我们先简要回顾一下Android系统架构,这将有助于理解BatteryService在其中扮演的角色。Android系统分为四个主要层次:应用程序层、应用程序框架层、库和Android运行时以及...

    android BatteryDog源码.rar

    《深入剖析Android BatteryDog源码》 Android BatteryDog是一款针对Android设备电量监控的应用,它能够帮助用户追踪手机电池的使用情况,分析应用耗电行为,从而优化设备的电池寿命。通过对BatteryDog的源码进行...

    如何让Android系统或Android应用执行shell脚本

    Android 系统或 Android 应用执行 shell 脚本的方法 Android 系统或 Android 应用执行 shell 脚本是 Android 开发中的一项重要技术,通过执行 shell 脚本,可以实现一些复杂的操作,例如设置网络参数、启动服务等...

    Android底层开发实战_Android底层开发实战_android_android开发实战_

    4. **Android系统服务**:分析系统服务如Activity Manager、Power Manager、Battery Service等,它们是如何管理设备状态和用户交互的。 5. **JNI(Java Native Interface)**:学习如何使用JNI在Java代码和C/C++...

    Android-提高android服务进程的优先级

    在Android系统中,服务(Service)是一种用于在后台执行长时间操作的应用组件,它不提供用户界面,但可以与其他组件交互。在某些情况下,开发者可能希望确保服务能够保持运行,即使设备资源紧张,也不会轻易被系统杀...

    Android实现电池管理系统

    Framework/base/services/java/com/android/server/battery目录下的BatteryService.java和BatteryStatsService.java分别是用来监听电池事件和统计电池参数的服务。此外,系统还会自动触发过温报警和低电报警时的关机...

    Android 之 监控手机电量

    在分析源码时,可以查看`frameworks/base/services/core/java/com/android/server/BatteryService.java`,这是Android系统中电池服务的主要实现。这里包含了处理电池状态更新、广播发送和对外暴露接口等功能。通过对...

    Android自定义显示电池电量

    BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE); ``` 接下来,我们可以使用BatteryManager提供的方法来获取电池的状态、级别、温度等信息。例如,`getBatteryLevel()`方法...

    Battery-Indicator-Pro,Android电池指示灯.zip

    《Battery-Indicator-Pro:深入解析Android电池指示器的开源实现》 在当今移动设备的世界里,电池指示器是用户界面中的重要元素,它为用户提供实时电池状态信息,从而帮助他们管理设备的用电情况。Battery-...

    Android-电池信息获取

    BatteryManager batteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE); ``` 有了BatteryManager实例后,你可以调用其方法来获取电池信息。例如,以下代码片段展示了如何获取电池当前的...

    玩转Android之-权限设置

    ### 玩转Android之-权限设置 在深入探讨Android中的权限设置之前,我们先来了解下Android系统是如何管理应用程序的权限的。Android系统通过权限(Permission)机制控制应用程序访问受保护的数据或执行可能对用户...

Global site tag (gtag.js) - Google Analytics