2013-04-01 61 views
30

我已经在网上搜索并找不到我的问题的答案。我的问题是只获取一次电池电量信息,例如。调用函数getBatteryLevel()。只有使用BroadcastReceiver才能实现的解决方案,但据我所知,每次在电池电量发生变化时都会调用它。请告诉我,我如何才能获得这些信息一次?使用Android SDK仅获取一次电池电量

+4

使用'BroadcastReceiver',然后一旦你取得值,只是取消注册接收器。 – TronicZomB

回答

96

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类中概述的其他附加内容。

+0

现在不能使用接收器(例如Widget)调用此方法。您是否知道通过Widget的onUpdate()方法获取电池电量的其他方法? –

+1

如果你是通过一个小部件来完成这个工作,你需要像这样调用'registerReceiver':'getApplicationContext()。registerReciever(...)'使它工作。 – MCeley

+0

我有一个上下文并可以调用它,但是不允许从接收者中调用该调用,并将此或null作为第一个参数“receiver”传递。日志消息非常明确,您无法从接收器中调用。 –