警报管理器不会在三星手机上的正确时间唤醒



不幸的是,在某些三星手机上,我们不得不发现AlarmManager(SamsungAlarmManager(无法按预期工作。

我们的代码是:

private void scheduleNextSamplingIntent(final Context context, final int intervalInMillis) {
Log.v(TAG, "scheduleNextSamplingIntent |  intervalInMillis = " + intervalInMillis);
if (intervalInMillis <= 0) {
Log.w(TAG, "scheduleNextSamplingIntent | invalid interval " + intervalInMillis);
return;
}
long currentTimeMillis = DeviceClock.getInstance().getCurrentTimeMillis();
long triggerAtMillis = currentTimeMillis + intervalInMillis;
Log.v(TAG, "scheduleNextSamplingIntent |  currentTimeMillis = " + currentTimeMillis);
Log.v(TAG, "scheduleNextSamplingIntent |  triggerAtMillis = " + triggerAtMillis);

PendingIntent samplingPendingIntent = getSamplePendingIntent(context);
AlarmManagerCompat alarmManager = new AlarmManagerCompat(context);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtMillis, samplingPendingIntent);
}

我们怀疑,应用程序会在一段时间后被唤醒(例如 1 分钟(,但有时计时器唤醒太晚了几分钟!

日志猫输出为:

10-25 15:26:03.118 32734 32734 I MotionDetectorService: Analyzed motion: SLEEPING
10-25 15:26:03.120 32734 32734 D MotionDetector: symptomaticStateGracePeriodOver ? 1540473963119 - 1540473823091 = 140028 ?> 300000
10-25 15:26:03.120 32734 32734 D MotionDetector: Still symptomatic but grace period not over yet. Keep gracing ...
10-25 15:26:03.121 32734 32734 V MotionDetectorService: notifyListeners | MotionDetector
10-25 15:26:03.121 32734 32734 V MotionDetectorService: scheduleNextSamplingIntent | intervalInMillis = 13000
10-25 15:26:03.122 32734 32734 V MotionDetectorService: scheduleNextSamplingIntent | currentTimeMillis = 1540473963121
10-25 15:26:03.122 32734 32734 V MotionDetectorService: scheduleNextSamplingIntent | triggerAtMillis = 1540473976121
10-25 15:26:03.137 3781 4353 D SamsungAlarmManager: setExact Intent (T:0/F:5/AC:false) 20181025T153059 - CU:10227/CP:32734

计时器应在1540473976(Unix(上触发=> 2018-10-25T15:26:16

但是为什么三星警报管理器设置为15:30:59?

这里有什么问题?有什么建议吗?

(似乎问题仅在三星S8和具有Android 7的三星S8.0设备上(

经过数小时的测试,我们找到了一种解决方法,可以在三星安卓手机上启动计时器不到 5 分钟。

我似乎在空闲模式下一段时间后,三星警报管理器不允许设置少于 5 分钟的计时器。如果手机处于空闲模式(打瞌睡灯模式(,三星警报管理器会覆盖设置的精确时间从 13 秒到 5 分钟,因为电池优化。将应用程序放入电池优化白名单(电池未监控的应用程序(没有任何帮助!(看来三星干脆忽略了这个列表!!(

我们的解决方法现在使用 AlarmManager.setAlarmClock(( 而不是 setExactAndAllowWhileIdle((。但是这种解决方案的缺点是在右上角显示闹钟图标。 为了避免这种情况,我们在手机是交互式时使用setExactAndAllowWhileIdle((,只有当它不是交互式时,我们才使用setAlarmClock((!

因此,我们设置小于 5 分钟的计时器的代码现在是:

public void setExactAndAllowWhileIdleOrAlarmClockWhenNotInteractive(final int type, final long triggetAtMillis, final PendingIntent operation) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !mPowerManager.isInteractive()) {
Log.v(TAG, "setExactAndAllowWhileIdleOrAlarmClockWhenNotInteractive | not interacive | setAlarmClock = " + triggetAtMillis);
mAlarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggetAtMillis, operation), operation);
} else {
Log.v(TAG, "setExactAndAllowWhileIdleOrAlarmClockWhenNotInteractive | interacive | setExactAndAllowWhileIdle = " + triggetAtMillis);
setExactAndAllowWhileIdle(type, triggetAtMillis, operation);
}
}

注意:华为手机与三星手机具有相同的问题!

最新更新