电池广播接收器不工作
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,则需要一个服务,否则只需在应用程序启动时注册并在应用程序销毁时取消注册。以上是关于电池广播接收器不工作的主要内容,如果未能解决你的问题,请参考以下文章