监听电池状态只需要接收Intent.ACTION_BATTERY_CHANGED的广播即可,当电池状态发生变化时会发出广播。
1.运行状态如下图:
(1)连接USB时的状态
(2)断开USB时的状态
2.实现代码如下,各个状态通过名字就很容易知道意思,BatteryManager类中定义了电池状态。
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private TextView mTvVoltage; private TextView mTvTemperature; private TextView mTvLevel; private TextView mTvStatus; private TextView mTvHealth; private TextView mTvTechnology; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTvVoltage = (TextView)findViewById(R.id.tv_voltage); mTvTemperature = (TextView)findViewById(R.id.tv_temperature); mTvLevel = (TextView)findViewById(R.id.tv_level); mTvStatus = (TextView)findViewById(R.id.tv_status); mTvHealth = (TextView)findViewById(R.id.tv_health); mTvTechnology = (TextView)findViewById(R.id.tv_technology); this.registerReceiver(this.mBatteryReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED)); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { int voltage=arg1.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0); mTvVoltage.setText("电压:" + voltage / 1000 + "." + voltage % 1000 + "V"); int temperature=arg1.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,0); mTvTemperature.setText("温度:" + temperature / 10 + "." + temperature % 10 + "℃"); if (temperature >= 300) { mTvTemperature.setTextColor(Color.RED); } else { mTvTemperature.setTextColor(Color.BLUE); } int level=arg1.getIntExtra(BatteryManager.EXTRA_LEVEL,0); int scale=arg1.getIntExtra(BatteryManager.EXTRA_SCALE,0); int levelPercent = (int)(((float)level / scale) * 100); mTvLevel.setText("电量:" + levelPercent + "%"); if (level <= 10) { mTvLevel.setTextColor(Color.RED); } else { mTvLevel.setTextColor(Color.BLUE); } int status = arg1.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN); String strStatus = "未知状态";; switch (status) { case BatteryManager.BATTERY_STATUS_CHARGING: strStatus = "充电中……"; break; case BatteryManager.BATTERY_STATUS_DISCHARGING: strStatus = "放电中……"; break; case BatteryManager.BATTERY_STATUS_NOT_CHARGING: strStatus = "未充电"; break; case BatteryManager.BATTERY_STATUS_FULL: strStatus = "充电完成"; break; } mTvStatus.setText("状态:" + strStatus); int health = arg1.getIntExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN); String strHealth = "未知 :(";; switch (status) { case BatteryManager.BATTERY_HEALTH_GOOD: strHealth = "好 :)"; break; case BatteryManager.BATTERY_HEALTH_OVERHEAT: strHealth = "过热!"; break; case BatteryManager.BATTERY_HEALTH_DEAD: // 未充电时就会显示此状态,这是什么鬼? strHealth = "良好"; break; case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE: strHealth = "电压过高!"; break; case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE: strHealth = "未知 :("; break; case BatteryManager.BATTERY_HEALTH_COLD: strHealth = "过冷!"; break; } mTvHealth.setText("健康状况:" + strHealth); String technology = arg1.getStringExtra(BatteryManager.EXTRA_TECHNOLOGY); mTvTechnology.setText("电池技术:" + technology); } }; }
3.Layout布局如下,很简单只有几个TextView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/tv_battery_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#0000FF" android:textStyle="bold" android:text="@string/battery_status" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@id/tv_battery_status" > <TextView android:id="@+id/tv_voltage" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_temperature" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_level" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_status" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_health" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_technology" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout>