电池的信息,电压,温度,充电状态等等,都是由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)
分享到:
相关推荐
Wakelock是Android电源管理中的另一关键组件,它允许应用程序或服务请求保持设备的部分或全部活跃。Wakelocks可以阻止设备进入休眠状态,直到释放Wakelock。根据需要,Wakelocks可以是全局的(阻止整个设备休眠)或...
1. **Power HAL**(Hardware Abstraction Layer):是Android电源管理的核心接口,它提供了一套标准的接口供上层系统服务调用,用于控制硬件的电源状态。Power HAL实现了与具体硬件平台相关的电源管理功能。 2. **...
Android电源管理可以分为两部分:硬件电源管理和软件电源管理。硬件电源管理主要是通过硬件设备来控制电源的使用,如关闭不必要的设备、降低CPU的频率等。软件电源管理主要是通过软件来控制电源的使用,如使用Wake...
### Android电源管理相关应用技巧详解 #### 一、引言 随着智能手机的普及和技术的发展,Android作为主流的移动操作系统之一,其电源管理技术对于提升用户体验至关重要。本文将深入探讨Android电源管理的技术细节,...
Android电源管理分为软件和硬件两部分,前者主要通过系统服务进行,后者则依赖于硬件平台的固件支持。 Android电源管理系统主要由以下几个组件组成: 1. **Power HAL(Hardware Abstraction Layer)**:这是硬件...
Android电源管理是操作系统中一个至关重要的部分,它涉及到设备的电池寿命、性能优化以及用户体验。在Android系统中,电源管理主要目标是确保设备在不牺牲用户体验的前提下尽可能地节省电力。本文将深入探讨Android...
### Android电源管理详解 #### 一、概述 在Android系统中,电源管理是一个非常重要的功能模块,它直接关系到移动设备的续航能力。良好的电源管理不仅能够提升用户体验,还能增加设备的整体性能。本文将深入探讨...
本示例项目"android电源管理显示例子"提供了一个完整的实现,展示了如何获取并显示设备的电源状态信息。以下是这个项目涉及的一些核心知识点: 1. **PowerManager**: PowerManager是Android SDK中的一个关键类,...
Wake_Lock是Android电源管理中的一个重要机制,它允许开发者或系统服务阻止设备进入休眠状态。当应用程序或服务需要保持活动时(例如,后台下载、闹钟或电话通话),它可以通过获取Wake_Lock来确保CPU和相关硬件保持...
这个“android 部分学习资料”压缩包很可能是包含了一系列与Android开发相关的教程、文档、代码示例等资源,帮助初学者或者有经验的开发者深入理解Android平台的工作原理和开发技巧。 1. **Android基础知识** - **...
### Android的电话部分(Telephony)原理及实现 #### 第一部分 Android电话部分的综述 Android作为一款全球广泛使用的智能手机操作系统,其电话部分(Telephony)功能是核心且不可或缺的一部分。这一部分主要负责...
1. **系统服务**: Android的system层包含了许多重要的系统服务,如Activity Manager Service (AMS),用于管理应用程序的生命周期;Window Manager Service (WMS),处理窗口管理和布局;Power Manager Service (PMS)...
虽然这部分源码可能不包括完整的内核,但会包含与Android系统相关的驱动和子系统,如电源管理、内存管理、网络堆栈等。理解这部分源码有助于进行底层优化和硬件集成。 4. **Framework层**: 这包括Activity...
Android SDK Platforms 21包含了开发Android 5.0应用所需的所有工具和库,是Android开发者不可或缺的部分。 1. **Material Design**:Android 5.0引入了全新的设计语言——Material Design。这种设计风格强调层次感...
### Android的电话部分知识点 #### 一、Android电话部分的综述 Android作为现代智能手机操作系统的重要组成部分,其电话部分的设计尤为关键。这部分不仅涉及到基本的通话功能,还包括短信(SMS)、数据连接(Data ...
2. Device Drivers:设备驱动,包括显示驱动、触摸屏驱动、电源管理驱动、音频驱动等,它们是直接与硬件打交道的部分。 3. Service Managers:服务管理器,如电池服务、相机服务等,它们在用户空间中管理和协调硬件...