BatteryService monitors the charging status, and charge level of the device battery. When these values change this service broadcasts the new values to all IntentReceivers (android.content.BroadcastReceiver) that are watching the BATTERY_CHANGED (android.content.Intent#ACTION_BATTERY_CHANGED) action.
The new values are stored in the Intent data and can be retrieved by calling Intent.getExtra (android.content.Intent#getExtra) with the following keys:
?"scale" - int, the maximum value for the charge level.
?"level" - int, charge level, from 0 through "scale" inclusive.
?"status" - String, the current charging status.
?"health" - String, the current battery health.
?"present" - boolean, true if the battery is present.
?"icon-small" - int, suggested small icon to use for this state.
?"plugged" - int, 0 if the device is not plugged in; 1 if plugged into an AC power adapter; 2 if plugged in via USB.
?"voltage" - int, current battery voltage in millivolts.
?"temperature" - int, current battery temperature in tenths of a degree Centigrade.
?"technology" - String, the type of battery installed, e.g. "Li-ion".
1. mUEventObserver.startObserving("SUBSYSTEM=power_supply");
??? private UEventObserver mUEventObserver = new UEventObserver() {
??????? @Override
??????? public void onUEvent(UEventObserver.UEvent event) {
??????????? update();
??????? }
??? };
Observe power supply status. When there is a change, it update the battery status by invoking the update method.
?
2. update
The battery information is required by invoking the native_update method, which is implemented in the file frameworks/base/services/jni/com_android_server_battery_service.cpp.
In fact, all these information is required from the system file /sys/class/power_supply.
(For more infomation, we need to dig inside Linux kernel.)
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
{
??? setBooleanField(env, obj, gPaths.acOnlinePath, gFieldIds.mAcOnline);
??? setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline);
??? setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent);
???
??? setIntField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);
??? setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage);
??? setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature);
???
??? 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[] = {
???? /* name, signature, funcPtr */
??? {"native_update", "()V", (void*)android_server_BatteryService_update},
};
--------------------------------------------------
Also, we could see that two method will be invoked. From the name you will know what they are doing.
??????? shutdownIfNoPower();
??????? shutdownIfOverTemp();
???
??? private final void shutdownIfOverTemp() {
??????? // shut down gracefully if temperature is too high (> 68.0C)
??????? // wait until the system has booted before attempting to display the shutdown dialog.
??????? if (mBatteryTemperature > 680 && ActivityManagerNative.isSystemReady()) {
??????????? Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
??????????? intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
??????????? intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
??????????? mContext.startActivity(intent);
??????? }
??? }
Finally, if either status changes, it will notify the observers.
详细解决方案
How BatteryService works in android
热度:67 发布时间:2016-05-01 17:14:56.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android RadioButton如何设置默认选中
- android 怎么重新设置锚点
- android 图片对象获取的有关问题
- android 关于服务连接的疑义
- android 怎么实现对view的放大和缩小
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java) 中文乱码的有关问题
- VSS开发,查看获取文件签出状态,报错 This command only works on files,该怎么处理
- VSS开发,查看获取资料签出状态,报错 This command only works on files
- android 动态设立控件高度
- Android test project 编译方法
- android 4.03启动出错,显示"Encryption Unsuccessful"该如何解决
- Android 下面的listView的动态效果怎么实现的?求源代码,多谢
- Android?Palm?Symbian?Windows Mobile?学哪个有“钱图”?解决方案
- Android 开发语言,该怎么解决
- 单个人去做手机开发选什么平台好?android,iphone?解决办法
- Android 虚拟机崩溃的有关问题
- 想学学移动平台的开发 android 还是windows phone7好啊该怎么处理
- Android 上的如何读写设备文件
- Android 2.2 API 汉语文档系列(3) —— AccessibilityService
- 【先睹为快】ArcGIS Android SDK上一版本新特性
- ArcGIS for Android app v2.0.4公布