前言:本文主要讲解了battery中如何读取sys中的一些电池相关的数据,然后发送给上层的内容。也会对某些数据节点进行拓展讲解。

1.BatteryService.java(frameworks\base\services\java\com\android\server)

BatteryService是在系统启动的时候就跑起来的,(通过SystemServer.java可以看出)


电池的信息是实时的变化的,那如何能实时的更新电池的信息呢,

BatteryService会通过UEventObserver启动一个onEventThread

并会在构造函数中启动UEventObserver

mUEventObserver.startObserving("SUBSYSTEM=power_supply");

启动之后就不会停止,


然后会调用update()来更新电池的信息

Update()通过JNI来com_android_server_BatteryService.cpp(frameworks\base\services\jni) 读取数据,BatteryService通过JNI注册不仅是函数还有变量。

2.com_android_server_BatteryService.cpp(frameworks\base\services\jni)

在此函数中对status,healths,technology进行了读取


Android Battery 在framework相关介绍_第1张图片

那还有其他的数据呢,是从哪里读取的呢,下面看一下

register_android_server_BatteryService()


3.register_android_server_BatteryService()(frameworks\base\services\jni)

此函数是在libandroid_servers.so被载入的时候,通过调用JNI_OnLoad()来调用的,

Android Battery 在framework相关介绍_第2张图片

在此也可以看BatteryService需要的数据

(1). mAcOline 电源是连接方式是AC

(2). mUsbOnline 电源的连接方式是USB

(3). mBatteryStatus

(4). mBatteryHealth

(5). mBatteryPresent

(6). mBatteryLevel 电量的等级

(7). mBatteryTechnology 电池类型

(8). mBatteryVoltage 电压

(9).mBatteryTemperature 温度

BatteryStatus有5个状态,分别是:

public static final int BATTERY_STATUS_UNKNOWN = 1;

public static final int BATTERY_STATUS_CHARGING = 2;

public static final int BATTERY_STATUS_DISCHARGING =3;

public static final int BATTERY_STATUS_NOT_CHARGING =4;

public static final intBATTERY_STATUS_FULL = 5;

BatteryHealth有6个状态,分别是:

public static final int BATTERY_HEALTH_UNKNOWN= 1;

public static final intBATTERY_HEALTH_GOOD = 2;

public static final intBATTERY_HEALTH_OVERHEAT = 3;

public static final intBATTERY_HEALTH_DEAD = 4;

public static final intBATTERY_HEALTH_OVER_VOLTAGE = 5;

public static final intBATTERY_HEALTH_UNSPECIFIED_FAILURE = 6;

4.BatteryService是如何把数据传出去的

BatteryService通过Intent把数据传出去

Android Battery 在framework相关介绍_第3张图片

说明:

mPlugType是链接的电源方式0 means it is on battery, other constants are different typesof power sources.)

BATTERY_SCALE 是电池的最大level

Icon integercontaining the resource ID of a small status bar icon indicating the current batterystate.

将所有的数据封装到Intent中,然后通过

ActivityManagerNative.broadcastStickyIntent(intent,null);

传出去。

5.应用如何接收数据

应用如果想要接收到BatteryService发送出来的电池信息,则需要注册一个Intent为

Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver

注册方法如下:

IntentFiltermIntentFilter = new IntentFilter();mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);registerReceiver(mIntentReciver,mIntentFilter);privateBroadcastReceiver mIntentReceiver = new BroadcastReceiver(){@OverridePublic voidonReceive(Context context, Intent intent){           //TODO Auto-generated methodstub           String action = intent.getAction();           If(action.equals(Intent.ACTION_BATTERY_CHANGED)){                    int nVoltaget =intent.getIntExtra(“voltage”,0);                    if(nVoltage!=0){                             mVoltage.setText(“v:”+ nVoltage + “mV-Success…”);                    }                    Else{                             mVoltage.setText(“V:“+nVoltage+”mV-fall…”);                    }           } }}



更多相关文章

  1. android缓存框架ASimpleCache的使用 (网络请求数据并缓存)
  2. Android(四)数据存储之四 (转)
  3. Android 性能数据采集
  4. android获取摄像头视频帧数据
  5. Android Spinner填充数据后设置默认值

随机推荐

  1. Android(安卓)的网络编程(5)-通过ksoap2
  2. Android(安卓)类似HTML 中Table的网格Tab
  3. Android设置全屏
  4. Android中短信拦截解决方案
  5. Android通过HTTP协议实现多线程下载
  6. android onKeydown
  7. Android捕获监听Home键、最近任务列表键
  8. android 开发之Activity切换
  9. Android(安卓)activity之间传递数据
  10. android线程池的优化