可靠的方式跟踪Android电池的充电/放电状态

时间:2014-12-29 11:39:24

标签: android android-intent status battery

与其他许多人一样,我正在尝试创建一个简单的应用程序,每次手机连接或与充电器断开连接时都会记录条目。我计划使用这些数据来计算几周/几个月的平均充电和放电率,以了解电池在一段时间内的表现。

我在ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED的清单中声明了Intent过滤器,它们似乎正常运行。

现在,当他们被解雇时,我正在注册接收ACTION_BATTERY_CHANGED以获取电池EXTRA_LEVELEXTRA_STATUSEXTRA_PLUGGED。 (参考 - Obtaining usb cable plugged IN/OUT event using EXTRA_PLUGGED does not work

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intentPowerConn) {
        Intent intentBatChange = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        int chargeStatus    = intentBatChange.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        int chargeType      = intentBatChange.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        int chargeLevel     = intentBatChange.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);

        Toast.makeText(context, chargeStatus + " " + chargeType + " " + chargeLevel, Toast.LENGTH_SHORT).show();
    }
}

但是,此粘性广播返回的EXTRA_STATUS在电话连接后立即触发时仍显示为“放电”。其他额外内容(例如EXTRA_PLUGGEDEXTRA_LEVEL)会返回正确的值。

连接后手动刷新以获取ACTION_BATTERY_CHANGED操作会将STATUS恢复为正常收费。

连接后立即收到的意图是陈旧的,因为EXTRA_PLUGGED返回正确的类型(AC或USB)。

我有一个解决方法,我使用ACTION_POWER_CONNECTED/ACTION_POWER_DISCONNECTED意图操作来确定充电状态(如此处所述 - How to detect power connected state?)。

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context , Intent intentPowerConn) {
        Intent intentBatChange = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        int chargeStatus    = intentBatChange.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        int chargeType      = intentBatChange.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        int chargeLevel     = intentBatChange.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);

        String action = intentPowerConn.getAction();
        boolean chargeFlag = false;

        if(action.equals(Intent.ACTION_POWER_CONNECTED)) {
            chargeFlag = true;
        }
        else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
            chargeFlag = false;
        }

        Toast.makeText(context, chargeStatus + " " + chargeType + " " + chargeLevel + " " + chargeFlag, Toast.LENGTH_SHORT).show();
    }
}

我可能需要将STATUS用于BATTERY_STATUS_FULLBATTERY_STATUS_NOT_CHARGINGBATTERY_STATUS_UNKNOWN等其他方案。

所以我不想依赖意图。ACTION_POWER_CONNECTED行动。

鉴于此,检测当前充电状态的可靠方法是什么?

我正在考虑在注册ACTION_BATTERY_CHANGED intent;之前加上2秒的延迟,虽然我尚未对其进行测试,但我认为它可能会有效。

0 个答案:

没有答案