我正在尝试使用AlarmManager在我的应用中安排延迟检查。 (具体来说,在用户接近某个位置后的N分钟,我想检查它们是否仍然存在,如果是,请向他们发送通知。)
我已经通过检查他们是否已经进入我的位置更新接收器中的区域来实现此功能,如果有,则执行此类计划:
Intent geofenceIntent = new Intent(context, GeofenceReceiver.class)
// ...intent contents not important...
PendingIntent pi = PendingIntent.getBroadcast(context, 0, geofenceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar c = Calendar.getInstance();
c.add(Calendar.SECOND, getGeofenceDelaySeconds());
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
Log.v("Scheduling notification check for "+c.getTime());
当电池电量很高(比如50%)时,一切都像魅力一样。但是当它很低(比如10%)时,我会得到位置更新,他们会安排警报看似成功,但这个警报从未真正触发!
是什么给出的? Android在尝试节省电量时是否会停止发送某些类型的更新?我该如何解决这个问题(在延迟期间实际保持我的应用程序处于活动状态,这会导致电池寿命出现明显问题)?
答案 0 :(得分:2)
事实证明,这与使用实时时钟有关。
虽然我找不到它引用的文档(它不在AlarmManager中),this StackOverflow answer表示如果手机处于省电模式, AlarmManager.RTC_WAKEUP
警报不会触发。 AlarmManager.ELAPSED_REALTIME_WAKEUP
警报似乎没有遇到此问题,因此我可以通过切换到以下问题来解决问题:
Intent geofenceIntent = new Intent(context, GeofenceReceiver.class)
// ...intent contents not important...
PendingIntent pi = PendingIntent.getBroadcast(context, 0, geofenceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
long millis = SystemClock.elapsedRealtime() + 1000 * getGeofenceDelaySeconds();
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, millis, pi);