Android:在电池电量达到定义的水平时执行某些操作 [英] Android : Do something when battery is at a defined level

查看:110
本文介绍了Android:在电池电量达到定义的水平时执行某些操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm stuck with a little problem here.

我希望我的应用执行某项操作,但仅当电池电量为10%时才能执行.

I want my app to do something, but only when the battery is at 10%.

我的应用无法持续监控电池电量;它只是等待LOW_BATTERY意图.

My app doesn't watch the battery level constantly; it just waits for a LOW_BATTERY intent.

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

It works if i don't specify a level, but it works 3 times: 15%, 10%, and 5%

我只希望它做10%的事情.

I only want it to do something at 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

        }
    }
}

推荐答案

ACTION_BATTERY_LOW没有要尝试从中读取的Extras,因此每次获得percent作为-1.

ACTION_BATTERY_LOW doesn't have the Extras you're trying to read from it, so you're getting percent as -1 every time.

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

As @bimal hinted at, those Extras are attached to the ACTION_BATTERY_CHANGED Broadcast. That doesn't mean, however, that you should just register to receive that instead. ACTION_BATTERY_CHANGED is sticky, so registerReceiver() returns the last Intent immediately. That means you can do something like:

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 BroadcastReceiver调用的,因此您不必担心注销.这是一个很好的,干净的方法,只说现在的电池状态是什么?". (从技术上讲,这是上次发送广播时的 .)

Note that registerReciever() was called with a null BroadcastReceiver, so you don't have to worry about unregistering. This is a nice, clean way to just say "What is the battery status right now?" (Well, technically, it's what was it last time a Broadcast was sent.)

这篇关于Android:在电池电量达到定义的水平时执行某些操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆