首先,我想说我已经找了很多答案来回答这个问题。我正在尝试找出什么是最佳实践和对电池寿命最有益的方法。以下是我的情况:
我希望我的应用程序在设备达到某个用户定义的电池电量水平时暂停其活动,并且不必使用Intent.ACTION_BATTERY_LOW和Intent.ACTION_BATTERY_OKAY。我看到很多程序都有这个选项,我也想在我的应用程序中模仿它。
我知道Intent.ACTION_BATTERY_CHANGED必须是一个注册事件。你不能只在清单中声明它,以便BroadcastReceiver可以获取该接收器以获取Intent。我知道如何编写代码来获取电池电量/比例并查看设备是否通过USB或AC充电。
我的思路已经带我到了两个选择,我不知道哪个是最佳选择,或者是否还有其他我不知道的选择?也许有人可以帮助我分析一下这些选项的优缺点?
选项1:使用AlarmManager创建重复的警报,基本上每隔一段时间轮询设备以检查电池电量。因此,当我的闹钟触发时,它会发送一个自定义Intent给我的清单注册接收器来检查电池电量。
优点:没有运行可能被终止或耗尽电池寿命的后台服务。
缺点:无法实时检测设备从充电源插入/拔出,并且必须依赖下一个触发的闹钟来检测更改。
选项2:创建一个服务,为Intent.ACTION_BATTERY_CHANGED注册一个接收器,因此它不仅会在系统广播电池电量时获取电池电量,还将实时检测充电的变化。
优点:实时检测电池寿命变化和充电方式的变化。
缺点:需要运行一个持续的服务,可能会被终止,同时也会占用处理时间和电池寿命以保持检测。
电池电量:
在BroadcastReceiver响应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;
已插入/正在充电:
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