【发布时间】:2014-06-18 21:33:35
【问题描述】:
如果充电时电池电量达到一定值,我想启动 IntentService。
但是,我不想在AndroidManifest.xml 中为android.intent.action.BATTERY_CHANGED 注册BroadcastReceiver,因为我只需要在某个级别(例如 40%)并且仅在充电时启动该服务。
另一个想法是启动一项服务,只要手机充电就可以运行,并以编程方式注册接收器。
第三个想法是定期使用AlarmManager 启动服务并检查电池电量。
最好的方法是什么?
解决方案:
我已经从下面的答案中实现了第四个想法。
final int PI_REQUEST_CODE = 123456;
int pref_BatteryUpdatePeriod = 120000; // 2 minutes
// set repeating alarm manager
Intent monitorIntent = new Intent(this, CheckBatteryReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), PI_REQUEST_CODE, monitorIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().get(Calendar.MILLISECOND), pref_BatteryUpdatePeriod, pendingIntent);
以及警报的广播接收器:
public class CheckBatteryReceiver extends BroadcastReceiver {
private int targetBatterylevel = 40;
@Override
public void onReceive(Context context, Intent intent) {
// get sticky intent
Intent batteryStatusIntent = context.getApplicationContext()
.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int batteryLevel = batteryStatusIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 50);
// evaluate battery level
if(batteryLevel >= targetBatterylevel){
// start service to stop charging
} else {
// continue charging
}
}
}
注意:我必须使用 context.getApplicationContext() 而不是 context 否则应用程序会崩溃,但我无法在广播接收器中注册接收器
【问题讨论】:
标签: android broadcastreceiver batterylevel