2013-04-01 98 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」傳遞。日誌消息非常明確,您無法從接收器中調用。 –