2012-06-30 125 views
11

我與此帖有完全相同的問題:Battery broadcast receiver doesn't work。但似乎沒有人回答這個問題。我無法接收電池狀態更改的廣播?

這裏是我的廣播接收器:

public class BatteryLevelReceiver extends BroadcastReceiver{ 


    @Override 
    public void onReceive(Context context, Intent intent) { 
    Log.v("plugg", "plug change fired"); 
    Toast.makeText(context, " plug change fired", Toast.LENGTH_LONG).show(); 
     } 

這裏是我的AndroidManifest.xml:

<receiver android:name=".ReceversAndServices.BatteryLevelReceiver"> 
       <intent-filter android:priority="900"> 
       <action android:name="android.intent.action.BATTERY_LOW" /> 

       </intent-filter> 
      </receiver> 

      <receiver android:name=".ReceversAndServices.BatteryLevelReceiver"> 
       <intent-filter android:priority="900"> 
       <action android:name="android.intent.action.BATTERY_CHANGED" /> 
       </intent-filter> 
      </receiver> 

我也加入了這一行的清單:

<uses-permission android:name="android.permission.BATTERY_STATS"/> 

但仍沒有成功!

我真的很感激,如果有人能告訴我我做錯了什麼。

回答

19

the documentation for ACTION_BATTERY_CHANGED

您無法通過艙單申報組件收到此,只有通過顯式註冊它與Context.registerReceiver()。請參閱ACTION_BATTERY_LOW,ACTION_BATTERY_OKAY,ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED以瞭解與電池相關的不同廣播,這些廣播可以通過清單接收器發送併發送。

你有它:你必須從你的Java代碼明確註冊它。

+0

感謝Darshan,但我只想在電池電量不足或插上電源時運行服務。請您告訴我我該怎麼做? –

+2

如果這些是你關心的唯一兩個事件,那麼你根本不需要'ACTION_BATTERY_CHANGED',並且在清單中你將很好地註冊它們。被插入的廣播是「ACTION_POWER_CONNECTED」。這兩個操作都可以在同一個'intent-filter'下,你不需要設置優先級,也不需要'BATTERY_STATS'權限。 –

2

我剛剛遵循Android Developer Guide的Monitoring the Battery Level and Charging State並立即獲得成功。如果BatteryLevelReceiver是它自己的類,然後我會建議:

<receiver android:name=".BatteryLevelReceiver"> 
    <intent-filter android:priority="900"> 
     <action android:name="android.intent.action.BATTERY_LOW" /> 
     <action android:name="android.intent.action.BATTERY_CHANGED" /> 
    </intent-filter> 
</receiver> 

加成

我願意猜測,你寫BatteryLevelReceiver在ReceversAndServices嵌套類。根據Receiver as inner class in Android,你不能用非靜態類來做到這一點。你可以做BatteryLevelReceiver靜態類和登記的onResume()接收器,但是那麼你的應用程序將需要運行趕上事件......將您的接收器一個單獨的類和註冊這些意圖:

<receiver android:name=".BatteryLevelReceiver"> 
    <intent-filter android:priority="900"> 
     <action android:name="android.intent.action.BATTERY_LOW" /> 
     <action android:name="android.intent.action.BATTERY_OKAY" /> 
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> 
    </intent-filter> 
</receiver> 

(不BATTERY_CHANGED爲達山計算指出。)

+3

你必須立即接受成功'BATTERY_LOW',但你永遠不會收到'BATTERY_CHANGED'的方式。 –

+0

感謝Sam,但是一旦我給它添加靜態代碼,我就會得到一個錯誤:( –

+0

@Kevin_Dingo是的,我猜測你正在嘗試做什麼,我意識到自己的錯誤並正在寫更新,如果你還在獲取錯誤,請添加更多的細節到您的問題和logcat錯誤 – Sam