我的目标是:当我调用某些功能时,我想获得确切的当前电池状态(电平,电压等)。
首先,我尝试在我的应用程序中执行此操作,如website所示。然后我发现ACTION_BATTERY_CHANGED广播实际上是sticky,这意味着我得到的是上次广播,而不是当前的确切值。
实际上,我已经查看了android源代码。对于电池接口,驱动器具有读取电池内部寄存器的功能,其中包含当前的soc(充电状态),电压等。
所以我只是想知道系统如何以及何时发送粘性广播ACTION_BATTERY_CHANGED?它是否定期发送(例如,每10秒钟它会读取电池中的寄存器并发送广播)?或者它是根据其他标准发送的(例如,soc,电压的变化?但是电压会以mV的频率变化)?
为了实现我的目标,一个麻烦的方法是实现系统调用以调用驱动程序函数,然后重新编译NDK以使其在我的应用程序代码中可用。但我想知道我是否可以通过ACTION_BATTERY_CHANGED广播直接考虑我上面提到的内容?再次注册广播会有什么影响吗?
答案 0 :(得分:2)
只需将广播接收器注册为电池电量级别即可。您将在onReceive中获得电池电量的结果。
private void batteryLevel() {
BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
context.unregisterReceiver(this);
int rawlevel = intent.getIntExtra("level", -1);
int scale = intent.getIntExtra("scale", -1);
int level = -1;
if (rawlevel >= 0 && scale > 0) {
level = (rawlevel * 100) / scale;
}
batterLevel.setText("Battery Level Remaining: " + level + "%");
}
};
IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}
希望这会对你有所帮助。
答案 1 :(得分:1)
要详细说明Arpit的答案,ACTION_BATTERY_CHANGED
是一个"粘性"事件 - 这意味着它不需要接收器能够读取其值。这样你可以调用registerReceiver()接收器等于null,并立即同步读取所有电池统计数据,并且不需要取消注册。
以下是代码:
private void batteryLevel() {
IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent intent = registerReceiver(null, batteryLevelFilter);
if (intent != null) {
int rawlevel = intent.getIntExtra("level", -1);
int scale = intent.getIntExtra("scale", -1);
int level = -1;
if (rawlevel >= 0 && scale > 0) {
level = (rawlevel * 100) / scale;
}
batteryLevel.setText("Battery Level Remaining: " + level + "%");
}
}
此外,在极少数情况下,registerReceiver()
可能会抛出IllegalArgumentException: regist too many Broadcast Receivers
异常,因此您可能希望抓住它以避免崩溃。
答案 2 :(得分:1)
回答问题:
是否定期发送(例如,每隔10秒钟就会发送一次 在电池中注册并发送广播)?或者它是基于发送的 其他标准(例如,soc,电压的变化?但电压会发生变化 经常就mV而言?
没有一个正确答案,Android不做任何保证,因设备而异。
根据我使用不同电路板启动的经验,它高度依赖于管理电源的Linux内核驱动程序。我已经看到它每秒关闭一次或每30秒关闭一次。即使是相同的设备也会根据它是否连接到电源而以不同方式触发它。我倾向于看到通常会有一些固定的计时器触发它,另外主要的事件,如连接/拆卸充电器也会触发它。