使用Android SDK仅获取一次电池电量

33

我在网上搜索了,但找不到我的问题的答案。我的问题是仅一次获取电池电量信息,例如调用函数getBatteryLevel()。目前只有使用BroadcastReceiver实现的解决方案,但据我所知,它会在每次电池电量更改事件上被调用。请告诉我如何仅获取该信息一次?


5
使用一个BroadcastReceiver,获取到值后立即取消注册该接收器。 - TronicZomB
1个回答

100
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 类中概述的其他额外信息。


此方法现在无法从接收器(例如小部件)中调用。您知道是否有其他方法可以从小部件的onUpdate()方法中获取电池电量吗? - Andrew Mackenzie
1
如果您正在从小部件中执行此操作,则需要像这样调用registerReceivergetApplicationContext().registerReciever(...)才能使其正常工作。 - Michael Celey
我有一个上下文可以调用,但是从接收器中不允许使用传递此或null作为第一个参数"receiver"进行调用。日志消息非常明确,你不能从接收器内部调用。 - Andrew Mackenzie
2
你不能使用任何上下文,你需要使用从getApplicationContext()返回的上下文来调用另一个接收器中的registerReceiver()。我已经尝试过这个方法,它是有效的。这也是在这个问题中给出的答案,这个问题与你所问的非常相似:https://dev59.com/ZVDTa4cB1Zd3GeqPI2hK - Michael Celey
1
使用ApplicationContext非常完美!谢谢! - Andrew Mackenzie
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接