Android:当电池电量处于定义水平时做某事

Posted

技术标签:

【中文标题】Android:当电池电量处于定义水平时做某事【英文标题】:Android : Do something when battery is at a defined level 【发布时间】:2012-04-24 22:12:35 【问题描述】:

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

我希望我的应用做某事,但前提是电池电量为 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

        
    

【问题讨论】:

我从来没有处理过电池电量,但为什么不接受三个通知,在每个通知中测试电池电量,只有在 10% 时才行动? 除了 Sam 的评论之外,请记住,不能保证您将获得正好 10% 的广播。特定设备可以轻松地以 11% 的频率广播,然后再以 9% 的频率广播。 致 Sam:嘿,这正是我所做的!我收到关于低电量的通知,然后我检查它是否为 10%,然后我做点什么。但它永远不会奏效。也许正如 CommonsWare 建议的那样,我也应该尝试接受 9 和 11 %。我会告诉你 !谢谢 ! ;) 它不起作用!我什至尝试过“if(percent>8 && percent 只检查你得到的百分比,而不是说“没用”。如果您对百分比的检索很糟糕并且您得到奇怪的数字,那么这就是您的问题。如果您仅在 7.8% 时被戳中,那么您就是这样。只是在某处调试并写入百分比?然后,如果您确实触发了您的事件,请确保您设置了某种标志,它不会触发两次? 【参考方案1】:

ACTION_BATTERY_LOW 没有您尝试从中读取的 Extras,因此您每次都将 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() 是使用 null 广播接收器调用的,因此您不必担心取消注册。这是一种很好、干净的方式,可以说“现在电池状态如何?” (嗯,从技术上讲,它是 上次发送广播时的内容。)

【讨论】:

谢谢。但是现在我怎样才能确保我只执行一次“做某事”,并且只执行一次,直到下一次它变低? @user1352526 这是一个不同的问题,但很简单:ACTION_BATTERY_OKAY 专门用于让您知道电池何时不再“低”。因此,1)也注册该广播,2)设置一个标志,指示“此低状态已被处理”,当您响应 LOW 状态时,3)当您收到 LOW 广播时,如果它是,请忽略它已经被处理,并且 4) 当你得到 OKAY 广播时清除那个标志。 非常感谢,我会照顾好。这可能很有用 但我想知道......我应该期望在您的“onReceive”中播放什么广播? @user1352526 您可以注册以同时接收ACTION_BATTERY_LOWACTION_BATTERY_OKAY;这就是if(intent.getAction().equals(ACTION_BATTERY_LOW)) 的用途——所以你可以知道你刚刚收到了哪个广播并做出相应的回应。你可能想要else if(intent.getAction().equals(ACTION_BATTERY_OKAY)) 在它下面,这是 OKAY 广播的逻辑。【参考方案2】:

在这种情况下,您可以使用“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;
        
    

希望这会对您有所帮助。

【讨论】:

以上是关于Android:当电池电量处于定义水平时做某事的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于后台模式时,电池电量通知不起作用

android 自定义View绘制电池电量(电池内带数字显示)

Android中的Doze模式

电池电量低/正常时禁用/启用BroadcastReceiver

当一个动作被派发时做某事

当计算机进入“睡眠”状态时做某事