繁体   English   中英

AlarmManager在正确的时间无法在Samsung Phone上唤醒

[英]AlarmManager does not wakeup at right time on Samsung Phone

不幸的是,在某些三星手机上,我们不得不发现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分钟)后被唤醒,但有时计时器醒来时间太晚了!

logcat的输出为:

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

但是,为什么将SamsungAlarmManager设置为15:30:59?

这是怎么了 有什么建议么?

(看来问题仅出现在装有Android 8.0的Samsung S8和Samsung S7设备上)

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

我似乎在空闲模式下经过一段时间后,SamsungAlarmManager不允许将计时器设置为少于5分钟。 如果手机处于空闲模式(打light模式),则由于电池优化,SamsungAlarmManager会将setExact-Time从13s覆盖到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);
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM