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 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- VSS开发,查看获取文件签出状态,报错 This command only works on files,该怎么处理
- VSS开发,查看获取资料签出状态,报错 This command only works on files
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度