电池广播接收器不工作

Posted

技术标签:

【中文标题】电池广播接收器不工作【英文标题】:Battery broadcast receiver doesn't work 【发布时间】:2011-12-20 22:00:24 【问题描述】:

我不知道为什么,但我的。

androidManifest.xml

<receiver android:name=".BatteryReceiver" android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_CHANGED" />
        <action android:name="android.intent.action.BATTERY_LOW" />
    </intent-filter>
</receiver>

电池接收器.java

public class BatteryReceiver extends BroadcastReceiver

    @Override
    public void onReceive(Context context, Intent intent)
    
        int level = intent.getIntExtra( "level", 0 );
        Log.d("Battery", "level: "+level);
        Toast.makeText(context, "Battery low!", Toast.LENGTH_LONG).show();      
    

我的代码有什么问题? 我正在使用控制台 (telnet) 来更改电池电量(电源容量 X)。

【问题讨论】:

【参考方案1】:

有几个问题;我已经通过降低严重性对它们进行了粗略的排序:

    您无法从 Manifest 注册 ACTION_BATTERY_CHANGED;您必须以编程方式注册。

    不要使用BATTERY_STATS 权限;完全不相关。

    如果您在同一个 BroadcastReceiver 中接收到多个广播(即使您没有接收到,这通常也是一个好主意),您应该检查一下您刚刚收到了哪个广播。 ACTION_BATTERY_LOW 不应以与 ACTION_BATTERY_CHANGED 相同的方式处理。 (一方面,它没有附加BatteryManager.EXTRA_LEVEL Extra,因此尝试读取它会给你默认值0。)

    您应该使用-1 作为默认值,而不是像0 这样的有效值。

    您应该检查是否收到了默认值并进行适当处理。

    您应该使用BatteryManager.EXTRA_LEVEL 而不是硬编码“级别”。

【讨论】:

完美答案!更进一步,我可以在不启动服务的情况下注册 BATTERY_CHANGED(性能考虑),比如说使用 BOOT 接收器或 AlarmManager 或其他什么? @thecr0w 不,您不能从清单中声明的​​ BroadcastReceiver 调用Context.registerReceiver()(必须是 BOOT_COMPLETED 接收器)。从 AlarmManager 接收器注册它没有多大意义,因为注册与注册它的对象的生命周期相关联。如果您需要始终接收 BATTERY_CHANGED,则需要一个服务,否则只需在应用程序启动时注册并在应用程序销毁时取消注册。

以上是关于电池广播接收器不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何触发电池百分比更改的事件?

通知广播接收器在活动中不工作

电池小部件不更新

应用程序未运行时,SMS 广播接收器不工作

onResume 后广播接收器不工作

特殊广播接收者