13

我遇到了与这篇文章完全相同的问题: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"/>

但是还是没有成功!

如果有人能告诉我我做错了什么,我将不胜感激。

4

3 回答 3

23

ACTION_BATTERY_CHANGED 的文档中

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

你有它:你必须从你的 Java 代码中显式地注册它。

于 2012-06-30T20:43:22.757 回答
2

我刚刚遵循了 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 中的嵌套类编写。根据Receiver as internal class in Android,你不能用非静态类做到这一点。您可以将 BatteryLevelReceiver 设为静态类并在 onResume() 中注册接收器,但随后您的应用将需要运行以捕获事件...将接收器移动到单独的类并注册这些 Intent:

<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 正如 Darshan Computing 指出的那样。)

于 2012-06-30T20:31:26.833 回答
0

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

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

于 2012-06-30T20:47:22.747 回答