Android 电量状态监听(非百分比监听


前言

遇到一个手机电量管理软件开发案例,主界面需要显示当前手机的实时电量。但是我在翻了一些文档之后没有查到监听电量的方法。和广大网友一样退而求其次,选择监听电量状态。


一、导入此类

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);

猜你喜欢

转载自blog.csdn.net/qq_49757305/article/details/127465227