我正在尝试使用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在试图节省电量时会停止发送某些类型的更新吗?我该如何解决(在延迟期间实际上未使我的应用保持活动状态,这会导致电池寿命出现明显问题)?

最佳答案

事实证明,这与实时时钟的使用有关。

尽管我找不到它引用的文档(不在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);

关于android - Android AlarmManager.set(…):电池电量不足时永远不会收到通知,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20849942/

10-12 03:12