This is a sticky broadcast containing the charging state, level, and other information about the battery. See BatteryManagerfor documentation on the contents of the Intent.manifests里声明一个receive ,你只能通过Context.registerReceiver()注册。. See ACTION_BATTERY_LOW,ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED, and ACTION_POWER_DISCONNECTED

This is a protected intent that can only be sent by the system.


Constant Value: "android.intent.action.BATTERY_CHANGED"




如果我们注册了对 Intent.ACTION_BATTERY_CHANGED 的监听,那么我们马上会收到一个Action为Intent.ACTION_BATTERY_CHANGED的intent,之后只要我们没有取消监听,一定电池发送变化,我们也会收到这样的intent。电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService通过广播 主动把数据传送给所关心的应用程序。


通过该intent的extra我们可以取得电池的很多信息,比如电压可以用如下的方式:voltage=intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);




BatteryManager类列出了该intent的extra所包含的信息:

String EXTRA_HEALTH : integer.它表示当前电池的健康状态。

可能的值为:

int BATTERY_HEALTH_COLD 

int BATTERY_HEALTH_DEAD 

int BATTERY_HEALTH_GOOD

int BATTERY_HEALTH_OVERHEAT

int BATTERY_HEALTH_OVER_VOLTAGE

int BATTERY_HEALTH_UNKNOWN

int BATTERY_HEALTH_UNSPECIFIED_FAILURE

String EXTRA_ICON_SMALL  : integer.the resource ID of a small status bar icon indicating the current battery state.

它是当前用于表示电池状态的icon的资源id.

String EXTRA_LEVEL

: integer.它表示电池当前的电量, 它介于0和  EXTRA_SCALE之间

.

String EXTRA_PLUGGED  : integer.它表示当前手机使用的是哪里的电源。


可能的值有:


0:表示电源是电池


int  BATTERY_PLUGGED_AC :表示电源是AC charger.[应该是指充电器]。

int  BATTERY_PLUGGED_USB :表示电源是USB port.

String EXTRA_PRESENT : boolean.表示是否提供电池。有些手机在使用USB电源的情况下,即使拔出了电池,仍然可以正常工作。

String EXTRA_SCALE : integer.表示电池电量的最大值.

String EXTRA_STATUS  : integer。表示电池的当前状态。

可能的值为:

int  BATTERY_STATUS_CHARGING 表示正在充电。


int  BATTERY_STATUS_DISCHARGING 

int  BATTERY_STATUS_FULL 表示充满

int  BATTERY_STATUS_NOT_CHARGING 表示没有充电

int  BATTERY_STATUS_UNKNOWN表示未知状态。

String EXTRA_TECHNOLOGY  :表示电池使用的技术。比如,对于锂电池是Li-ion.

String EXTRA_TEMPERATURE :integer 。表示当前电池的温度。 

String EXTRA_VOLTAGE  : integer。表示当前电池的电压。.



另外还有两种intent专门用于表示电量低的情况


ACTION_BATTERY_LOW : 表示当前电池电量低。


ACTION_BATTERY_OKAY:表示当前电池已经从电量低恢复为正常。




当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。

电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。

类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。


判断当前充电状态

通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。

因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。


  1. IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
  2. Intent batteryStatus = context.registerReceiver(null, ifilter);
  3. //你可以读到充电状态,如果在充电,可以读到是usb还是交流电
  4.  
  5. // 是否在充电
  6. int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
  7. boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
  8. status == BatteryManager.BATTERY_STATUS_FULL;
  9.  
  10. // 怎么充
  11. int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
  12. boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
  13. boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;


通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。

监听充电状态的改变

充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。

充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED 和ACTION_POWER_DISCONNECTED作为过滤。


  1. <receiver android:name=".PowerConnectionReceiver">
  2. <intent-filter>
  3. <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
  4. <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  5. </intent-filter>
  6. </receiver>


在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:


  1. public class PowerConnectionReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
  5. boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
  6. status == BatteryManager.BATTERY_STATUS_FULL;

  7. int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
  8. boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
  9. boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
  10. }
  11. }


判断当前剩余电量

在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。
你可以用下面的代码读到电量:


  1. //当前剩余电量
  2. int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
  3. //电量最大值
  4. int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
  5. //电量百分比
  6. float batteryPct = level / (float)scale;


监听剩余电量显著改变

持续监听电池状态不容易,但你不必这么做。
一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。


  1. <receiver android:name=".BatteryLevelReceiver">
  2. <intent-filter>
  3. <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
  4. <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
  5. </intent-filter>
  6. </receiver>


剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。


获取数据

<span style="font-size:32px;"> </span><span style="font-size:18px;"> int status = intent.getIntExtra("status", 0);        //电池状态,充电、放电、充满、未充电
  int health = intent.getIntExtra("health", 0);   <span >	</span>//电池的健康状态
  boolean present = intent.getBooleanExtra("present", false);   
  int level = intent.getIntExtra("level", 0);           //获取当前电量  
  int scale = intent.getIntExtra("scale", 0);           //获取总电量  
  int icon_small = intent.getIntExtra("icon-small", 0);   
  int plugged = intent.getIntExtra("plugged", 0);   
  int voltage = intent.getIntExtra("voltage", 0);        // 电池伏数
  int temperature = intent.getIntExtra("temperature", 0); // 电池温度
  String technology = intent.getStringExtra("technology");   

      //电池状态
       switch (intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN)) {
       {
                case BatteryManager.BATTERY_STATUS_CHARGING:
                    BatteryStatus = "充电状态";
                    break;
                case BatteryManager.BATTERY_STATUS_DISCHARGING:
                    BatteryStatus = "放电状态";
                    break;
                case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
                    BatteryStatus = "未充电";
                    break;
                case BatteryManager.BATTERY_STATUS_FULL:
                    BatteryStatus = "充满电";
                    break;
                case BatteryManager.BATTERY_STATUS_UNKNOWN:
                    BatteryStatus = "未知道状态";
                    break;
          }

       switch (intent.getIntExtra("plugged", BatteryManager.BATTERY_PLUGGED_AC)) 
       {
                case BatteryManager.BATTERY_PLUGGED_AC:
                    BatteryStatus2 = "AC充电";
                    break;
                case BatteryManager.BATTERY_PLUGGED_USB:
                    BatteryStatus2 = "USB充电";
                    break;
        }


        switch (intent.getIntExtra("health",
                        BatteryManager.BATTERY_HEALTH_UNKNOWN)) 
        {
                case BatteryManager.BATTERY_HEALTH_UNKNOWN:
                    BatteryTemp = "未知错误";
                    break;
                case BatteryManager.BATTERY_HEALTH_GOOD:
                    BatteryTemp = "状态良好";
                    break;
                case BatteryManager.BATTERY_HEALTH_DEAD:
                    BatteryTemp = "电池没有电";
                    break;
                case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
                    BatteryTemp = "电池电压过高";
                    break;
                case BatteryManager.BATTERY_HEALTH_OVERHEAT:
                    BatteryTemp =  "电池过热";
                    break;
           }
</span>





简单例子


android电池充满监听 安卓充电电流监控_android


<RelativeLayout
            android:id="@+id/play_rl_power_info"
            android:layout_width="34.0dip"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true" >

            <ImageView
                android:id="@+id/play_iv_battery"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="2.0dip"
                android:layout_marginTop="1.0dip"
                android:layout_centerHorizontal="true"
                android:visibility="visible" />

            <TextView
                android:id="@+id/play_tv_cur_time"
                android:layout_width="34.0dip"
                android:layout_height="wrap_content"
                android:layout_below="@+id/play_iv_battery"
                android:layout_marginRight="0.0dip"
                android:layout_marginTop="2.0dip"
                  android:layout_centerHorizontal="true"
                android:textColor="@color/background_white_50"
                android:textSize="10.0sp"
                android:gravity="center"
                 android:text="23:54"
                android:textStyle="bold" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/play_report_speed_layout"
            android:layout_width="wrap_content"
            android:layout_height="23.0dip"
            android:layout_centerVertical="true"
            android:layout_marginRight="24.0dip"
            android:layout_toLeftOf="@+id/play_rl_power_info" >

            <TextView
                android:id="@+id/play_report_speed_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/background_white_50"
                android:gravity="center" />
        </RelativeLayout>

        <ImageButton
            android:id="@+id/btn_back_land"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:background="@null"
            android:padding="15.0dip"
            android:src="@drawable/detail_back_ico_selector" />

        <LinearLayout
            android:id="@+id/play_title_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10.0dip"
            android:layout_marginRight="10.0dip"
            android:layout_toLeftOf="@+id/play_report_error_layout"
            android:layout_toRightOf="@+id/btn_back_land"
            android:gravity="center_vertical"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/play_title_info_name_land"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="marquee"
                android:gravity="left"
                android:marqueeRepeatLimit="marquee_forever"
                android:singleLine="true"
                android:textColor="#ffffffff"
                android:textSize="20.0sp" />
        </LinearLayout>
    </RelativeLayout>



在上面的资源文件中只需要关注play_iv_battery这个ImageView

stat_sys_battery_charge.xml


<?xml version="1.0" encoding="utf-8"?>
<level-list
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="14">
        <animation-list android:oneshot="false"
          xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:duration="2000" android:drawable="@drawable/stat_sys_battery_charge_anim0" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim1" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim2" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim3" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim4" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim5" />
        </animation-list>
    </item>
    <item android:maxLevel="29">
        <animation-list android:oneshot="false"
          xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:duration="2000" android:drawable="@drawable/stat_sys_battery_charge_anim1" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim2" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim3" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim4" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim5" />
        </animation-list>
    </item>
    <item android:maxLevel="49">
        <animation-list android:oneshot="false"
          xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:duration="2000" android:drawable="@drawable/stat_sys_battery_charge_anim2" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim3" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim4" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim5" />
        </animation-list>
    </item>
    <item android:maxLevel="69">
        <animation-list android:oneshot="false"
          xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:duration="2000" android:drawable="@drawable/stat_sys_battery_charge_anim3" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim4" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim5" />
        </animation-list>
    </item>
    <item android:maxLevel="89">
        <animation-list android:oneshot="false"
          xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:duration="2000" android:drawable="@drawable/stat_sys_battery_charge_anim4" />
            <item android:duration="1000" android:drawable="@drawable/stat_sys_battery_charge_anim5" />
        </animation-list>
    </item>
    <item android:drawable="@drawable/stat_sys_battery_charge_anim5" android:maxLevel="101" />
</level-list>



stat_sys_battery.xml


<?xml version="1.0" encoding="utf-8"?>
<level-list
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/stat_sys_battery_0" android:maxLevel="4" />
    <item android:drawable="@drawable/stat_sys_battery_10" android:maxLevel="14" />
    <item android:drawable="@drawable/stat_sys_battery_20" android:maxLevel="29" />
    <item android:drawable="@drawable/stat_sys_battery_40" android:maxLevel="49" />
    <item android:drawable="@drawable/stat_sys_battery_60" android:maxLevel="69" />
    <item android:drawable="@drawable/stat_sys_battery_80" android:maxLevel="89" />
    <item android:drawable="@drawable/stat_sys_battery_100" android:maxLevel="100" />
</level-list>



private class BatteryInfoBroadcastReceiver  extends BroadcastReceiver
	{
		@Override
		public void onReceive(Context context, Intent intent)
		{
			   int status = intent.getIntExtra("status", 0);   
			   int level = intent.getIntExtra("level", 0);   
			   switch (status) {   
               case BatteryManager.BATTERY_STATUS_UNKNOWN:   
            	   play_iv_battery.setImageResource(R.drawable.stat_sys_battery_unknown);  
                   break;   
               case BatteryManager.BATTERY_STATUS_CHARGING:  
            	   Toast.makeText(MainActivity.this, "正在充电", 300).show();
                   play_iv_battery.setImageResource(R.drawable.stat_sys_battery_charge);   
                   play_iv_battery.getDrawable().setLevel(level);   
                   break;   
               case BatteryManager.BATTERY_STATUS_DISCHARGING:   
                   play_iv_battery.setImageResource(R.drawable.stat_sys_battery);  
                   play_iv_battery.getDrawable().setLevel(level);   
                   Toast.makeText(MainActivity.this, "正在放电", 300).show();
                   break;   
               case BatteryManager.BATTERY_STATUS_NOT_CHARGING:   
                   break;   
               case BatteryManager.BATTERY_STATUS_FULL:   
            	   play_iv_battery.setImageResource(R.drawable.stat_sys_battery_100);  
                   break;   
               }  
		}
		
	}


注册:


IntentFilter mIntentFilter  = new IntentFilter();mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
	batteryInfo = new BatteryInfoBroadcastReceiver();
	registerReceiver(batteryInfo, mIntentFilter);



至于资源文件我是从 *度视频apk里得到的,自己去反编译找。


















参考:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html