Использование AlarmManager для обновления виджетов вручную - PullRequest
4 голосов
/ 13 февраля 2011

Как указано в Android Dev Guide, если вы хотите, чтобы виджет обновлялся чаще, вы должны использовать AlarmManager для установки будильников, которые не будят устройство.

В принципе: не используйте стандартные механизмы, предоставляемые классом AppWidgetProvider, и его легко настроить с помощью android: updatePeriodMillis в файле xml.

Прошу прощения, но руководство просто заявляет: "используйте AlarmManager, используйте RTC или ELAPSED_REALTIME, ...", но КАК ТОЧНО отправить сообщение об обновлении моего виджета, отсутствует !!!

Может ли кто-нибудь указать код, который мне нужен для формирования PendingIntent, который имитирует поведение по умолчанию? Я понятия не имею, как получить идентификаторы виджета, какое действие я должен использовать и так далее ... Печально, что руководство разработчика перестает объяснять на этом этапе! Что нужно в качестве дополнений к какому действию?

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

Теперь: когда устройство спит, конечно, это никогда не должно будить его - так что я понимаю этот раздел в руководстве разработчика, что это правильный способ его реализации; кто-нибудь думает, что я не прав? Ах, еще одна вещь, которую я хотел бы узнать: если устройство спит, когда виджет должен быть обновлен, и мой сигнал тревоги не выдается из-за спящего устройства, будет ли он обновлен НЕМЕДЛЕННО, когда он проснется ???

Спасибо за вашу помощь !!

PS: Мне действительно интересно, почему определение xml провайдера виджетов не позволяет просто указывать «не будить устройство» с помощью логического переключателя ... это сделало бы жизнь намного проще! Какой виджет нужен, чтобы разбудить устройство в любом случае ??? ; -)

Это то, как далеко я дошел, но это не работает - ничего не происходит:

private void startAlarm(Context pContext) {
    Log.d(TAG, "startAlarm");
    AlarmManager am = (AlarmManager) pContext.getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
    intent.setClass(pContext, getClass());
    PendingIntent pi = PendingIntent.getBroadcast(pContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, pi);
}

Ответы [ 2 ]

1 голос
/ 13 февраля 2011

Может ли кто-нибудь указать, какой код мне нужен для формирования PendingIntent, который имитирует поведение по умолчанию?

Я бы не стал, потому что AFAIK невозможно точно «имитировать поведение по умолчанию». Просто используйте AlarmManager сигнал тревоги, используя PendingIntent, который либо отправляет пользовательское действие на AppWidgetProvider, которое вы обрабатываете в onReceive(), либо вызывает startService() на IntentService, который вы используете для настоящих умов позади вашего виджет приложения.

Понятия не имею, как получить идентификаторы виджета

Вы сохранили идентификаторы виджетов из фактических вызовов onUpdate(), например, когда виджет приложения впервые выводится на экран. Когда будильник отключится, обновите все виджеты приложения.

обновлять виджет каждую минуту, отображая время отправления следующего автобуса (вот что я хочу !!)

Пожалуйста, позвольте этому быть настраиваемым пользователем.

О, еще одна вещь, которую я хотел бы узнать: если устройство спит, когда должен быть обновлен виджет, и мой сигнал тревоги не выдается из-за спящего устройства, будет ли он обновлен НЕМЕДЛЕННО, когда он проснется ???

AFAIK, да, но я не использовал сигналы тревоги, которые не относятся к _WAKEUP.

0 голосов
/ 21 июня 2012

Не знаю, могут ли они все еще помочь вам, но я написал несколько постов об Android Widget несколько дней назад.

Вот что касается AlarmManager:

http://malubu.wordpress.com/2012/06/05/take-your-time-widgets-and-alarmmanager/

...