我无法在电池状态更改时收到广播?

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

但仍然没有成功!

如果有人能给我意见,告诉我到底哪里做错了,我将不胜感激。

3个回答

24

根据 ACTION_BATTERY_CHANGED 文档:

你不能通过在清单文件中声明的组件接收此广播,只能通过使用 Context.registerReceiver() 显式地注册来接收它。请参阅 ACTION_BATTERY_LOW、ACTION_BATTERY_OKAY、ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED,这些是可通过清单接收的不同的与电池相关的广播。

因此,您必须从Java代码中显式注册才能接收此广播。


谢谢Darshan,但我想只在电池低或插入时运行服务。你能告诉我应该怎么做吗? - Zardaloop
2
如果这是你关心的唯一两个事件,那么你根本不需要ACTION_BATTERY_CHANGED,在清单文件中注册它们即可。插入电源的广播是ACTION_POWER_CONNECTED。这两个操作可以在同一个intent-filter下进行,你无需设置优先级,并且也不需要BATTERY_STATS权限。 - Darshan Rivka Whittle

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类的一个嵌套类编写。根据Android中的内部类接收器,非静态类无法这样使用。您可以将BatteryLevelReceiver定义为静态类,并在onResume()中注册接收器,但是您的应用程序需要运行才能捕获事件……将您的接收器移动到一个单独的类中,并注册以下Intents:

<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。)

4
您已经成功立刻收到了 BATTERY_LOW 的通知,但以这种方式您将无法接收到 BATTERY_CHANGED 的通知。 - Darshan Rivka Whittle
谢谢Sam,但是一旦我加上static,就会出现错误:( - Zardaloop
@Kevin_Dingo 是的,我猜测了一下你想做什么。我意识到了我的错误并正在编写更新。如果你仍然遇到错误,请在你的问题和logcat错误中添加更多细节。 - Sam
@Sam,虽然这个接收器将自动触发,但它是否自动注册了该广播接收器?如果是这样的话,我们需要注销它吗?我猜想,如果我们需要监控电池电量,我们就不应该注销,那么如果我们不注销会有什么不利影响吗? - OnePunchMan
@DarshanRivkaWhittle,当安卓电池充满时,让我的应用程序启动的最佳方法是什么? - user3760100
@user3760100 没有专门针对充满电池的广播,因此您需要注册 ACTION_BATTERY_CHANGED,并在该接收器中自行判断电池是否已充满。 (请注意,状态 BatteryManager.BATTERY_STATUS_FULL 和充电达到100%之间通常存在差异。) - Darshan Rivka Whittle

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接