电池状态改变我无法收到广播?

时间:2012-06-30 20:09:43

标签: android broadcastreceiver battery

我遇到与此帖相同的问题:Battery broadcast receiver doesn't work。但似乎没有人回答这个问题。

这是我的BroadcastReceiver:

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"/>

但仍然没有成功!

如果有人能告诉我我做错了什么,我真的很感激。

3 个答案:

答案 0 :(得分:22)

来自the documentation for ACTION_BATTERY_CHANGED

  

只有通过使用Context.registerReceiver()显式注册它,才能通过清单中声明的​​组件来接收它。请参阅ACTION_BATTERY_LOW,ACTION_BATTERY_OKAY,ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED,了解发送并可通过清单接收器接收的不同电池相关广播。

你有它:你必须从你的Java代码中明确注册它。

答案 1 :(得分:2)

我刚刚在Monitoring the Battery Level and Charging State上关注了Android开发人员指南,并立即取得了成功。如果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中的嵌套类。根据{{​​3}},你不能用非静态类做到这一点。您可以将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>

(Darshan Computing指出,不是BATTERY_CHANGED。)

答案 2 :(得分:0)

确保您不将电池接收器类作为另一个类的子类,而是作为项目中的单独类。

还要尝试在代码中显式使用Context.registerReceiver()方法,并且不要忘记取消注册它:http://developer.android.com/reference/android/content/Context.html#registerReceiver%28android.content.BroadcastReceiver,%20android.content.IntentFilter%29