前言
遇到一个手机电量管理软件开发案例,主界面需要显示当前手机的实时电量。但是我在翻了一些文档之后没有查到监听电量的方法。和广大网友一样退而求其次,选择监听电量状态。
一、导入此类
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import com.yw.clean.utlis.LogUtils;
public class BatteryListener {
private Context mContext;
private BatteryBroadcastReceiver receiver;
private BatteryStateListener mBatteryStateListener;
public BatteryListener(Context context) {
mContext = context;
receiver = new BatteryBroadcastReceiver();
}
public void register(BatteryStateListener listener) {
mBatteryStateListener = listener;
if (receiver != null) {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_LOW);
filter.addAction(Intent.ACTION_BATTERY_OKAY);
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
mContext.registerReceiver(receiver, filter);
}
}
public void unregister() {
if (receiver != null) {
mContext.unregisterReceiver(receiver);
}
}
private class BatteryBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String acyion = intent.getAction();
switch (acyion) {
case Intent.ACTION_BATTERY_CHANGED://电量发生改变
if (mBatteryStateListener != null) {
LogUtils.e( "BatteryBroadcastReceiver --> onReceive--> ACTION_BATTERY_CHANGED");
mBatteryStateListener.onStateChanged();
}
break;
case Intent.ACTION_BATTERY_LOW://电量低
if (mBatteryStateListener != null) {
LogUtils.e( "BatteryBroadcastReceiver --> onReceive--> ACTION_BATTERY_LOW");
mBatteryStateListener.onStateLow();
}
break;
case Intent.ACTION_BATTERY_OKAY://电量充满
if (mBatteryStateListener != null) {
LogUtils.e("BatteryBroadcastReceiver --> onReceive--> ACTION_BATTERY_OKAY");
mBatteryStateListener.onStateOkay();
}
break;
case Intent.ACTION_POWER_CONNECTED://接通电源
if (mBatteryStateListener != null) {
LogUtils.e("BatteryBroadcastReceiver --> onReceive--> ACTION_POWER_CONNECTED");
mBatteryStateListener.onStatePowerConnected();
}
break;
case Intent.ACTION_POWER_DISCONNECTED://拔出电源
if (mBatteryStateListener != null) {
LogUtils.e("BatteryBroadcastReceiver --> onReceive--> ACTION_POWER_DISCONNECTED");
mBatteryStateListener.onStatePowerDisconnected();
}
break;
}
}
}
}
public interface BatteryStateListener {
public void onStateChanged();
public void onStateLow();
public void onStateOkay();
public void onStatePowerConnected();
public void onStatePowerDisconnected();
}
}
如果你没有那个LogUtis
,删掉相关引用就好,不影响什么。
二、使用步骤
代码如下(示例):
public class MyActivity extends AppCompatActivity {
BatteryListener batteryListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
super.onStart();
batteryListener = new BatteryListener(this);
batteryListener.register(new BatteryListener.BatteryStateListener() {
@Override
public void onStateChanged() {
}
@Override
public void onStateLow() {
}
@Override
public void onStateOkay() {
}
@Override
public void onStatePowerConnected() {
}
@Override
public void onStatePowerDisconnected() {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
batteryListener.unregister();
}
}
三、获取电量百分比
1、导入此类
public class BatteryUtils {
/**
* 主动获取当前电池是否在充电 , 即数据线是否插在手机上
* @return
*/
public static boolean isBatteryCharging(Context context){
boolean isBatteryCharging = false;
// 主动发送包含是否正在充电状态的广播 , 该广播会持续发送
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
// 注册广播接受者
Intent intent = context.registerReceiver(null, intentFilter);
// 获取充电状态
int batteryChargeState = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
// 判定是否是 AC 交流电充电
boolean isAc = batteryChargeState == BatteryManager.BATTERY_PLUGGED_AC;
// 判断是否是 USB 充电
boolean isUsb = batteryChargeState == BatteryManager.BATTERY_PLUGGED_USB;
// 判断是否是 无线充电
boolean isWireless = batteryChargeState == BatteryManager.BATTERY_PLUGGED_WIRELESS;
// 如何上述任意一种为 true , 说明当前正在充电
isBatteryCharging = isAc || isUsb || isWireless;
return isBatteryCharging;
}
/**
* 获取当前电量百分比
* @param context 上下文
* @return 电量百分比
*/
public static float getBatteryPct(Context context){
// 主动发送包含是否正在充电状态的广播 , 该广播会持续发送
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
// 注册广播接受者
Intent batteryStatus = context.registerReceiver(null, intentFilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
return level * 100 / (float)scale;
}
}
2、使用
int batteryPct = (int) BatteryUtils.getBatteryPct(this);