Android:当电池处于定义的水平时做一些事情

Fre*_*ude 3 android power-management android-intent

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

我希望我的应用程序能够执行某些操作,但仅限于电池电量为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

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*tle 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,registerReciever()使用nullBroadcastReceiver 调用,因此您不必担心取消注册.这是一个很好,干净的方式,只是说"现在的电池状态是什么?" (当然,从技术上说,这是什么它广播发送最后一次.)