我在网上搜索了,但找不到我的问题的答案。我的问题是仅一次获取电池电量信息,例如调用函数getBatteryLevel()
。目前只有使用BroadcastReceiver
实现的解决方案,但据我所知,它会在每次电池电量更改事件上被调用。请告诉我如何仅获取该信息一次?
我在网上搜索了,但找不到我的问题的答案。我的问题是仅一次获取电池电量信息,例如调用函数getBatteryLevel()
。目前只有使用BroadcastReceiver
实现的解决方案,但据我所知,它会在每次电池电量更改事件上被调用。请告诉我如何仅获取该信息一次?
Intent.ACTION_BATTERY_CHANGED
广播是所谓的 “粘性广播”。因为这是粘性的,您可以使用空接收器注册广播,在调用 registerReceiver
时仅获取电池电量一次。public float getBatteryLevel() {
Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
// Error checking that probably isn't needed but I added just in case.
if(level == -1 || scale == -1) {
return 50.0f;
}
return ((float)level / (float)scale) * 100.0f;
}
可以从这个黏性广播中获取更多数据。使用返回的 batteryIntent
,您可以访问 BatteryManager
类中概述的其他额外信息。
registerReceiver
:getApplicationContext().registerReciever(...)
才能使其正常工作。 - Michael CeleygetApplicationContext()
返回的上下文来调用另一个接收器中的registerReceiver()
。我已经尝试过这个方法,它是有效的。这也是在这个问题中给出的答案,这个问题与你所问的非常相似:https://dev59.com/ZVDTa4cB1Zd3GeqPI2hK - Michael Celey
BroadcastReceiver
,获取到值后立即取消注册该接收器。 - TronicZomB