2012-05-24 2 views
1

Я пишу Android AppWidget, который нужно часто обновлять (да, я знаю, не должен этого делать, что бы ...). Я бы хотел, чтобы он обновлялся, только если он виден, но раздражающе кажется, что ничего не похоже на WallpaperService.Engine.onVisibilityChanged(boolean visible).Тревога срабатывает на «спящем» устройстве Android

Предлагаемый подход заключается в настройке аварийного сигнала с AlarmManager.setRepeating(AlarmManager.RTC, firstShot, interval, pendingIntent), который запускает обновление каждые interval миллисекунд. Это, по крайней мере, не разбудит устройство, когда оно спит.

Это именно то, что я сделал. Моя PendingIntent выглядит следующим образом:

final Intent intent = new Intent(context, CountdownWidgetService.class); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

final PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

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

ответ

1

Возможно, какое-то другое приложение у вас пробуждает устройство, и ваш сигнал тревоги выполняется с ним. Если вы используете AlarmManager.RTC, это означает: «выполнить, если устройство бодрствует или ждать, пока оно не проснется, а затем выполните». Проверьте LogCat, чтобы увидеть, что происходит, и использовать эту команду, чтобы увидеть, что зарегистрированы другие сигналы:

adb shell dumpsys alarm 
+0

@Oderik Вы, наверное, хотел бы добавить это как комментарий, а не как редактировать на мой пост. Добавьте его ниже, если хотите: РЕДАКТИРОВАТЬ: Терпение было ключевым: устройству нужно некоторое время, чтобы фактически заснуть после того, как экран погаснет (и АБР отключен). После этого будильник не срабатывает. Спасибо за совет, который приведет к правильному расследованию. Видя, как часто устройство просыпается, мне напоминают свежие родители. ;) –

+0

Нет, я действительно хотел отредактировать ответ, потому что он еще не включил решение: Android занимает некоторое время, прежде чем отправиться спать. Но я думаю, что другие тоже найдут это в комментариях. Еще раз спасибо! – Oderik

+1

Он появился как редактирование моего ответа. Кстати, причина, по которой «требуется некоторое время», чтобы заснуть, заключается в том, что в каком-то приложении есть блокировка следа. Android по умолчанию переходит в спящий режим, как только экран выключен. Приложения могут запрашивать у него бодрствование, пока они не закончат обработку, и т. Д. Http://developer.android.com/reference/android/os/PowerManager.WakeLock.html –

Смежные вопросы