Android 可以通过BroadcastReceiver来获取电池信息改变的广播(ACTION_BATTERY_CHANGED),从而获取到相关的电池信息。
电池信息,及其对应的相关常数(参考网址:http://blog.sina.com.cn/s/blog_5d2e69770102vh59.html)
电池信息 | 类型 | 备注 |
status | int | 取得电池的状态,返回的状态类型由 android.os.BatteryManager 类定义的常量所决定,包括: |
电池充电状态( BATTERY_STATUS_CHARGING ) | ||
电池放电状态( BATTERY_STATUS_DISCHARGING ) | ||
电池满电状态( BATTERY_STATUS_FULL ) | ||
电池不充电状态( BATTERY_STATUS_NOT_CHARGING ) | ||
电池未知状态( BATTERY_STATUS_UNKNOWN ) | ||
health | int | 取得电池的健康状态,返回的状态类型由 android.os.BatteryManager 类定义的常量所决定,包括: |
电池损坏( BATTERY_HEALTH_DEAD ) | ||
电池健康( BATTERY_HEALTH_GOOD ) | ||
电池过热( BATTERY_HEALTH_OVERHEAT ) | ||
电池电压过大( BATTERY_HEALTH_OVER_VOLTAGE ) | ||
未知状态( BATTERY_HEALTH_UNKOWN ) | ||
未明示故障( BATTERY_HEALTH_UNSPECIFIED_FAILURE ) | ||
present | boolean | 判断当前是否存在电池 |
level | int | 取得电池的剩余容量 |
scale | int | 取得电池的总容量,通常为 100 |
Icon-small | int | 取得电池对应的图标 ID |
plugged | int | 连接的电源插座类型,返回的状态由 android.os.BatteryManager 类定义的常量所决定,包括: |
USB 电源( BATTERY_PLUGGED_USB ) | ||
交流电电源( BATTERY_PLUGGED_AC ) | ||
voltage | int | 取得电池的电压 |
temperature | int | 取得电池的温度,单位是摄氏度 |
technology | String | 取得电池的类型 |
获取电池信息的步骤:
(1) 创建BroadcastReceiver,用于结束电池信息变化的广播
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
//TO GET BatteryInfo
}
(2) 重写onResume()方法,获取IntentFilter对象,并注册BroadcastReceiver
protected void onResume() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(mBroadcastReceiver, filter);
super.onResume();
}
(3)程序在后台的时候取消注册BroadcastReceiver
protected void onPause() {
unregisterReceiver(mBroadcastReceiver);
super.onPause();
}
实例:
public class GetBatteryInfo extends Activity {
private static final int REFRESH_TIME = 1;
private static boolean runtime=false;
private TextView mStatus_BatteryInfo;
private TextView mPlugged_BatteryInfo;
private TextView mLevel_BatteryInfo;
private TextView mScale_BatteryInfo;
private TextView mVoltage_BatteryInfo;
private TextView mTemperature_BatteryInfo;
private TextView mTechnology_BatteryInfo;
private TextView mHealth_BatteryInfo;
private TextView mRuntime_BatteryInfo;
private TimeThread timeThread; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InitView();
} private void InitView() {
mStatus_BatteryInfo=(TextView)findViewById(R.id.status_BatteryInfo);
mPlugged_BatteryInfo=(TextView)findViewById(R.id.plugged_BatteryInfo);
mLevel_BatteryInfo=(TextView)findViewById(R.id.level_BatteryInfo);
mScale_BatteryInfo=(TextView)findViewById(R.id.scale_BatteryInfo);
mVoltage_BatteryInfo=(TextView)findViewById(R.id.voltage_BatteryInfo);
mTemperature_BatteryInfo=(TextView)findViewById(R.id.temperature_BatteryInfo);
mTechnology_BatteryInfo=(TextView)findViewById(R.id.technology_BatteryInfo);
mHealth_BatteryInfo=(TextView)findViewById(R.id.health_BatteryInfo);
mRuntime_BatteryInfo=(TextView)findViewById(R.id.runtime_BatteryInfo);
} @Override
protected void onResume() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(mBroadcastReceiver, filter);
startTimeThread(timeThread);
super.onResume();
} @Override
protected void onPause() {
stopTimeThread(timeThread);
unregisterReceiver(mBroadcastReceiver);
super.onPause();
} /**
* @param milliseconds 将ms转化为hh:mm:ss 格式时间
* @return
*/
private String msToTime(int milliseconds ){
int allSeconds=(milliseconds/1000);
int hours=allSeconds/3600;
String hours_string;
int feelSeconds=allSeconds%3600;
int mimute=feelSeconds/60;
String mimute_string;
String second_string;
int second=feelSeconds%60;
if(hours<10){
hours_string="0"+String.valueOf(hours);
}else{
hours_string=String.valueOf(hours);
}
if(mimute<10){
mimute_string="0"+String.valueOf(mimute);
}else{
mimute_string=String.valueOf(mimute);
}
if(second<10){
second_string="0"+String.valueOf(second);
}else{
second_string=String.valueOf(second);
}
return hours_string+":"+mimute_string+":"+second_string;
} private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
int status = intent.getIntExtra("status", 0);
int health = intent.getIntExtra("health", 0);
int level = intent.getIntExtra("level", 0);
int scale = intent.getIntExtra("scale", 0);
int plugged = intent.getIntExtra("plugged", 0);
int voltage = intent.getIntExtra("voltage", 0);
int temperature = intent.getIntExtra("temperature", 0);
String technology = intent.getStringExtra("technology");
mLevel_BatteryInfo.setText(level+"");
mScale_BatteryInfo.setText(scale+"");
mVoltage_BatteryInfo.setText(voltage+"mV");
mTemperature_BatteryInfo.setText(((float)temperature/10)+"℃");
mTechnology_BatteryInfo.setText(technology+"");
mRuntime_BatteryInfo.setText(msToTime((int) SystemClock.elapsedRealtime()));
switch (status) {
case BatteryManager.BATTERY_STATUS_UNKNOWN:
mStatus_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_status_UNKNOWN));
break;
case BatteryManager.BATTERY_STATUS_CHARGING:
mStatus_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_status_CHARGING));
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
mStatus_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_status_DISCHARGING));
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
mStatus_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_status_NOT_CHARGING));
break;
case BatteryManager.BATTERY_STATUS_FULL:
mStatus_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_status_FULL));
break;
}
switch (health) {
case BatteryManager.BATTERY_HEALTH_UNKNOWN:
mHealth_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_health_UNKOWN));
break;
case BatteryManager.BATTERY_HEALTH_GOOD:
mHealth_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_health_GOOD));
break;
case BatteryManager.BATTERY_HEALTH_OVERHEAT:
mHealth_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_health_OVERHEAT));
break;
case BatteryManager.BATTERY_HEALTH_DEAD:
mHealth_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_health_DEAD));
break;
case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
mHealth_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_health_VOLTAGE));
break;
case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
mHealth_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_health_UNSPECIFIED_FAILURE));
break;
} switch (plugged) {
case BatteryManager.BATTERY_PLUGGED_AC:
mPlugged_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_plugged_AC));
break;
case BatteryManager.BATTERY_PLUGGED_USB:
mPlugged_BatteryInfo.setText(getResources().getString(R.string.BatteryInfo_plugged_USB));
break;
default:
mPlugged_BatteryInfo.setText("");
}
}
}
}; Handler TimeHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REFRESH_TIME:
mRuntime_BatteryInfo.setText(msToTime((int) SystemClock.elapsedRealtime()));//获取系统启动时间
break;
default:
break;
} super.handleMessage(msg);
} }; /**
* 打开线程timeThread
* @param timeThread
* @param runtime 运行标志位
*/
private void startTimeThread(Thread timeThread){
if(timeThread==null){
runtime=true;
timeThread=new TimeThread();
timeThread.start();
}
} /**
* 停止线程
* @param timeThread
*/
private void stopTimeThread(Thread timeThread){
if(timeThread!=null){
Thread.currentThread().interrupt();
timeThread.interrupt();
runtime=false;
} } class TimeThread extends Thread{
@Override
public void run() {
while(runtime){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg=new Message();
msg.what=REFRESH_TIME;
TimeHandler.sendMessage(msg);
}
} } }
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:clipToPadding="true"
android:fitsSystemWindows="true"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#5CD8AF"
android:gravity="center_vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="@string/SystemSetBatteryInfo_BatteryInfo_textvie"
android:textColor="@android:color/white"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_status_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/status_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_plugged_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/plugged_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_level_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/level_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_scale_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/scale_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_voltage_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/voltage_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_temperature_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/temperature_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_technology_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/technology_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_health_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/health_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="#FFFFFF"
android:gravity="center_vertical"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/SystemSetBatteryInfo_runtime_textview"
android:textColor="@color/main_view_color"
android:textSize="18sp" /> <TextView
android:id="@+id/runtime_BatteryInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/main_view_color"
android:textSize="18sp" />
</LinearLayout> </LinearLayout>
Strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">GetBatteryInfo</string>
<string name="SystemSetBatteryInfo_BatteryInfo_textvie">电池信息</string>
<string name="SystemSetBatteryInfo_status_textview">电池状态:</string>
<string name="SystemSetBatteryInfo_plugged_textview">充电方式:</string>
<string name="SystemSetBatteryInfo_level_textview">电池电量:</string>
<string name="SystemSetBatteryInfo_scale_textview">电池容量:</string>
<string name="SystemSetBatteryInfo_voltage_textview">电池电压:</string>
<string name="SystemSetBatteryInfo_temperature_textview">电池温度:</string>
<string name="SystemSetBatteryInfo_technology_textview">电池类型:</string>
<string name="SystemSetBatteryInfo_health_textview">健康状态:</string>
<string name="SystemSetBatteryInfo_runtime_textview">使用时间:</string>
<string name="BatteryInfo_status_CHARGING">正在充电</string>
<string name="BatteryInfo_status_DISCHARGING">正在耗电</string>
<string name="BatteryInfo_status_FULL">电量充满</string>
<string name="BatteryInfo_status_NOT_CHARGING ">未充电</string>
<string name="BatteryInfo_status_UNKNOWN">状态未知</string>
<string name="BatteryInfo_plugged_USB">USB电源</string>
<string name="BatteryInfo_plugged_AC">交流电电源</string>
<string name="BatteryInfo_health_DEAD">电池损坏</string>
<string name="BatteryInfo_health_GOOD">电池正常</string>
<string name="BatteryInfo_health_OVERHEAT">电池过热</string>
<string name="BatteryInfo_health_VOLTAGE ">电池电压过大</string>
<string name="BatteryInfo_health_UNKOWN">未知状态</string>
<string name="BatteryInfo_health_UNSPECIFIED_FAILURE">未明示故障</string> </resources>
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="main_view_color">#1f1f1f</color>
<color name="main_text_color">#6f6f6f</color>
</resources>