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_LOW
和ACTION_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绘制电池电量(电池内带数字显示)