我遇到与此帖相同的问题: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"/>
但仍然没有成功!
如果有人能告诉我我做错了什么,我真的很感激。
答案 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