3

我在这里遇到了一个小问题。

我希望我的应用程序做点什么,但只有在电池电量为 10% 时。

我的应用程序不会经常观察电池电量;它只是等待 LOW_BATTERY 意图。

如果我不指定级别,它会起作用,但它会起作用 3 次:15%、10% 和 5%

我只希望它以 10% 的速度做某事。

这是我的代码:

public void onReceive(Context context, Intent intent) 
{
    if(intent.getAction().equals(ACTION_BATTERY_LOW))
    {
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int percent = (level*100)/scale; 

        if(percent == 10)
        {
            // Do Something

        }
    }
}
4

2 回答 2

6

ACTION_BATTERY_LOW没有您要从中读取的附加内容,因此您每次都可以percent得到。-1

正如@bimal 所暗示的那样,这些附加内容附加ACTION_BATTERY_CHANGED广播中。但是,这并不意味着您应该只注册以接收它。 ACTION_BATTERY_CHANGED具有粘性,因此registerReceiver()立即返回最后一个 Intent。这意味着您可以执行以下操作:

public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals(ACTION_BATTERY_LOW)) {
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = context.registerReceiver(null, ifilter);

        int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int percent = (level*100)/scale; 

        if (percent <= 10 && percent > 5) {
            // Do Something
        }
    }
}

请注意,这registerReciever()是使用 BroadcastReceiver 调用的null,因此您不必担心取消注册。这是一种很好、干净的方式,可以说“现在电池状态如何?” (嗯,从技术上讲,这上次发送广播时的内容。)

于 2012-07-06T11:39:27.157 回答
3

在这种情况下,您可以使用“ACTION_BATTERY_CHANGED”

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
            int level = intent.getIntExtra("level", 0);
            int scale = intent.getIntExtra("scale", 100);
            double batStatus = level * 100 / scale;
        }
    }

希望这会帮助你。

于 2012-06-06T07:35:57.763 回答