Запуск повторяющейся сигнализации

287
08 января 2017, 17:10

Есть Service в приложении, который запускается при нажатии определённой кнопки (либо при запуске устройства через BroadcastReceiver).

В этом самом сервисе запускается AlarmManager.
Сигнализация должна срабатывать каждые 30 минут, т.е. в ровно и в половину часа.
Поэтому при старте сервиса он определяет текущее время и, если минуты меньше 30 - он назначает метку старта сигнализации на текущий час и 30 минут, если более 30 минут - то на следующий час ровно.
При этом само условие возвращает в миллисекундах ту метку, которая мне нужна (т.е., казалось бы, всё верно должно работать).
Вот, наконец уж, сам пример кода:

        Calendar realTime   = Calendar.getInstance();
        int realMin         = realTime.get(Calendar.MINUTE);
        Calendar setAlert   = new GregorianCalendar();
        setAlert.setTime(realTime.getTime());
        if(realMin<30)
        {
            setAlert.set(Calendar.MINUTE, 30);
            setAlert.set(Calendar.SECOND, 0);
            setAlert.set(Calendar.MILLISECOND, 0);
        }
        else
        {
            setAlert.add(Calendar.HOUR, 1);
            setAlert.set(Calendar.MINUTE, 0);
            setAlert.set(Calendar.SECOND, 0);
            setAlert.set(Calendar.MILLISECOND, 0);
        }
        Intent intent               = new Intent(this, NoticeClass.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, setAlert.getTimeInMillis(), AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);

setAlert.getTimeInMillis() - возвращает верную метку, например 1483705800000 - т.е. запуск назначается на 15:30 (Московское время).
И по факту - сигнализация происходит раз в пол часа, как и требует того AlarmManager.INTERVAL_HALF_HOUR.

Но всё таки результат не оправдал ожидания, вот логи:

01-06 15:35:34.034 2447-2447/ru.app D/myLogs: NoticeClass инициирован
01-06 16:03:34.160 2447-2447/ru.app D/myLogs: NoticeClass инициирован
01-06 16:31:34.251 2447-2447/ru.app D/myLogs: NoticeClass инициирован
01-06 17:00:00.005 2447-2447/ru.app D/myLogs: NoticeClass инициирован
01-06 17:37:34.420 2447-2447/ru.app D/myLogs: NoticeClass инициирован
01-06 18:07:34.892 2447-2447/ru.app D/myLogs: NoticeClass инициирован

Т.е. он как бы вроде как и хочет в ровно запускать нужную задачу, но как-то у него это плохо получается.
Тестирую в Genymotion, не пробовал на устройствах, но мне кажется разницы не будет, косяк где-то в моих каракулях.

Внимание, вопрос: как заставить эту штуку запускаться во время, вне зависимости от времени запуска самого сервиса, инициализирующего сигнализацию?

Answer 1

Согласно документации :

Note: as of API 19, all repeating alarms are inexact. If your application needs precise delivery times then it must use one-time exact alarms, rescheduling each time as described above. Legacy applications whose targetSdkVersion is earlier than API 19 will continue to have all of their alarms, including repeating alarms, treated as exact.

Начиная с API 19 точность повторяющегося аларма не гарантируется (система может "подвинуть" к другим событиям в целях энергосбережения).
Если уж очень важна точность, то для API >= 19 следует использовать AlarmManager.setExact(int, long, PendingIntent) и повторно заряжать при каждом срабатывании.

READ ALSO
Получить ID из View

Получить ID из View

Требуется получить ID объекта в виде String из объекта View

365
Получение данных по сети в разработке под Android

Получение данных по сети в разработке под Android

Всем доброго утра! Проблема заключается в выборе способа: мне требуется забирать некоторый JSON, который отдается на API сервера (Nodejs по некоторому...

406
Рекурсивный запрос по протоколу [требует правки]

Рекурсивный запрос по протоколу [требует правки]

Нужно создать рекурсивный запрос по UDP/TCP протоколуКто может подсказать, как это правильно реализовать?

326
Apache poi и поля в документе Word

Apache poi и поля в документе Word

Добрый деньПодскажите пожалуйста, есть шаблон документа Word, в котором имеется некоторый набор полей, в которые необходимо выгрузить соответствующие...

620