AlarmManager не просыпается в нужное время на телефоне Samsung - PullRequest
0 голосов
/ 25 октября 2018

На некоторых телефонах Samsung нам, к сожалению, пришлось выяснить, что 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?

Что здесь не так?Есть предложения?

(Кажется, что проблема только на устройствах Samsung S8 и Samsung S7 с Android 8.0)

1 Ответ

0 голосов
/ 01 ноября 2018

После нескольких часов тестирования мы нашли обходной путь для запуска таймеров менее 5 минут на телефоне Samsung Android.

Мне кажется, что через некоторое время в режиме ожидания SamsungAlarmManager не позволяет устанавливать таймеры менее 5 минут.Если телефон находится в режиме ожидания (режим ожидания), SamsungAlarmManager перезаписывает установленное точное время с 13 до 5 минут из-за оптимизации заряда батареи.Помещение приложения в белый список оптимизации батареи (приложения, не контролируемые батареей) ничего не помогает!(Кажется, что Samsung просто игнорирует этот список !!!)

Наш обходной путь теперь использует 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);
    }
}

Примечание. Телефоны Huawei имеют ту же проблему, что и телефоны Samsung!

...