2013-07-19 3 views
4

У меня есть приложение, которое должно регулярно запускать службу фона, и я использую AlarmManager для достижения такого поведения. Чтобы сократить длинный рассказ, он настроен на выполнение дважды в минуту (каждые 30 секунд), и для выполнения (в основном спать) требуется около 20 секунд.Android AlarmManager иногда поздно

Я использую несколько устройств Android для тестирования (Galaxy SII с 4.1.2, Nexus 4 с 4.2.2 и более поздними версиями с CyanogenMOD 10.1.2 и Nexus 7 с 4.2.2), и все они ведут себя последовательно при подключении к USB и отладчик.

Как только я отсоединяю устройство и оставляю его на столе, я замечаю, что ИНОГДА услуга пропустит один интервал. Очень внимательно смотря на журнал, я вижу, что служба иногда откладывается на определенный период времени. Если он должен работать в xx: 05 и xx: 35, я заметил, что он начинается с xx: 45 (на 10 секунд позже, чем он должен).

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

Моя первая мысль заключалась в том, что это было какое-то разделение ресурсов, которое вызывало поведение (есть другие процессы, запущенные с приложением), но сервис даже не запускается, он даже не получает блокировку слежения, пока некоторые 10 секунд спустя.

Следует отметить, что это поведение наиболее ярко проявляется на Nexus 4, где отсутствует до 30% данных, в то время как на Galaxy SII и Nexus 7 (около ~ 2%) значительно меньше, но это по-прежнему вызывает беспокойство, поскольку это необъяснимое поведение.

ответ

3

Вы не указали, какую тревогу вы используете, но, учитывая ваши жалобы, я предполагаю, что это сигнал тревоги _WAKEUP. Если да, то только гарантия у нас есть, если мы используем вещаниеPendingIntent, Android не позволит устройству проснуться во время разговора до onReceive(). Использование службы PendingIntent, как вы это делаете, является ненадежным, поскольку устройство может засыпать перед запуском службы и может приобрести WakeLock.

Следовательно, более надежная модель для _WAKEUP сигнализации заключается в использовании трансляции PendingIntent, имеют BroadcastReceiveracquire()WakeLock, затем его называют startService(), чтобы передать управление вашим услугам. Ваша служба выполняет свою работу, затем освобождает WakeLock.

У меня есть этот узор, завернутый в my WakefulIntentService component.

+0

Благодарим за ответ. Похоже, что описанная вами концепция повышает надежность за счет заметного запаса на Nexus 4, где она равна Galaxy S2, - однако есть еще один «пакет», который, по-видимому, отсутствовал (из 500, который он нажал, так как я сделал изменение). К сожалению, журнал был усечен после этого события, поэтому я не мог точно видеть, что произошло. – Iv4n

+1

Я отмечаю этот ответ как принятый, поскольку информация содержит улучшенную надежность Временной службы. Тем не менее, пока еще нет объяснения. – Iv4n