Есть 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, не пробовал на устройствах, но мне кажется разницы не будет, косяк где-то в моих каракулях.
Внимание, вопрос: как заставить эту штуку запускаться во время, вне зависимости от времени запуска самого сервиса, инициализирующего сигнализацию?
Согласно документации :
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)
и повторно заряжать при каждом срабатывании.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем доброго утра! Проблема заключается в выборе способа: мне требуется забирать некоторый JSON, который отдается на API сервера (Nodejs по некоторому...
Нужно создать рекурсивный запрос по UDP/TCP протоколуКто может подсказать, как это правильно реализовать?
Добрый деньПодскажите пожалуйста, есть шаблон документа Word, в котором имеется некоторый набор полей, в которые необходимо выгрузить соответствующие...