【发布时间】:2012-01-24 15:12:35
【问题描述】:
好吧,让我先说我一直在四处寻找这个问题的答案。我试图弄清楚什么是最佳实践以及最适合电池寿命的方法。这是我的情况:
我希望我的应用程序在设备达到某个用户定义的电池电量时暂停其活动,而不必使用 Intent.ACTION_BATTERY_LOW 和 Intent.ACTION_BATTERY_OKAY。我在很多程序中都看到了这个选项,并希望在我的应用程序中模拟它。
我了解 Intent.ACTION_BATTERY_CHANGED 必须是已注册的事件。您不能只在清单中为 BroadcastReceiver 声明它以获取该接收器以获取 Intent。我知道如何编写如何获取电池电量/规模并查看设备是通过 USB 还是 AC 充电
我目前的思考过程给我带来了 2 个选择,但我不知道哪个是最好的选择,或者是否还有其他我不知道的选择?也许有人可以帮助我解决这些选项的优缺点来帮助我吗??
选项 1: 使用 AlarmManager 创建重复警报,基本上每隔一段时间轮询设备以检查电池电量。这样当我的警报触发时,它会为我的清单注册接收器发送一个自定义 Intent 以检查电池电量。
PRO 没有运行可能会被杀死或耗尽电池寿命的后台服务。
CONs 无法实时检测设备从充电源插入/拔出,并且必须依靠下一次触发的警报来检测变化。
选项 2: 创建一个服务,为 Intent.ACTION_BATTERY_CHANGED 注册一个接收器,这样它不仅可以在系统广播时获取电池电量,还可以实时检测充电的变化。
PRO实时检测电池寿命变化和充电方式变化。
CON 持续运行的服务可能会被终止
CON 会消耗处理时间和电池寿命以保持检测继续进行
电池电量:
Get battery level before broadcast receiver responds for Intent.ACTION_BATTERY_CHANGED
Intent batteryIntent = context.getApplicationContext().registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int rawlevel = batteryIntent.getIntExtra("level", -1);
double scale = batteryIntent.getIntExtra("scale", -1);
double level = -1;
if (rawlevel >= 0 && scale > 0) {
level = rawlevel / scale;
插入/充电:
android USB connection charging signals
public static boolean isConnected(Context context) {
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
}
}
提前感谢
-H
【问题讨论】:
标签: android service broadcastreceiver battery