不幸的是,在某些三星手机上,我们不得不发现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);
}
}
注意:华为手机与三星手机具有相同的问题!