在SystemServer.java中可以看到启动BatteryService的代码:


          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中声明的变量,在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"
  

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


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



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



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




更多相关文章

  1. [置顶] Android(安卓)通过经纬度获取地理位置信息
  2. autoCompleteTextView
  3. Android(安卓)使用ContentObserver监听短信的变化,并发送信息给特
  4. Android(安卓)room操作数据库
  5. google地图demo
  6. Android中Data和String数据类型转换
  7. Android下的SQLite数据库的相关操作及AndroidTestCase测试
  8. Android中ListView异步加载数据
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. Android(安卓)Drawable介绍
  2. [Android]通过JNI访问并操作Bitmap的元素
  3. Android对话框实现
  4. (20120731)android面试总结(003)
  5. Android(安卓)---Check System Version a
  6. 值得推荐的android开发框架简介
  7. Android(安卓)自定义Galley中图片未居中
  8. 解决Android(安卓)Studio 3.4.1 无法打re
  9. Android(安卓)- View的绘制流程二(layout)
  10. Android(安卓)Studio创建新项目HelloWorl