2012-01-08 4 views
0

У меня есть приложение, которое загружает расписание и сохраняет его, а также регулярно загружает изменения в это расписание. В настоящее время я использую singleton, но я считаю это уродливым с точки зрения дизайна. Из-за загрузки мне нужна централизованная система для минимизации использования сети.Как обновить виджет из приложения?

В текущей ситуации каждый класс, требующий обновлений из singleton first, получает экземпляр этого синглтона, а затем предоставляет интерфейс, из которого вызывается некоторые методы, когда требуется обновление. В настоящее время singleton обрабатывает все загрузки в рабочих потоках. Обычно я бы использовал AsyncTask, вызванный из Activity, однако, потому что мне тоже нужно отправить результат в виджет, я не вижу эту работу.

Альтернатива - Сервис. Я просто привязал бы его как к виджету, так и к активности. Проблема в этом случае заключается в том, что я не могу связываться с BroadcastReceiver (которым является AppWidgetProvider). Проблема в том, что я не могу регулярно обновлять свой виджет.

Мой вопрос: как я могу (или: могу ли я) создать свое приложение таким образом, чтобы я мог обновлять свой виджет из службы (чтобы избавиться от синглтона) или есть лучший способ (возможно BroadcastReceivers)?

ответ

1

Как я могу (или: могу ли я) создать свое приложение таким образом, чтобы я мог обновить свой виджет из службы (чтобы избавиться от синглтона) или есть лучший способ (возможно, BroadcastReceivers)?

Чтобы обновить виджет приложения, позвоните updateAppWidget() по адресу AppWidgetManager. Это можно сделать в любой момент, а не только от AppWidgetProvider.

Чтобы обновить виджет приложения на периодической основе, используйте либо android:updatePeriodMillis в метаданных виджета приложения, либо настройте непосредственно AlarmManager. В любом случае вы хотели бы делегировать работу на IntentService, так как «загрузка расписания» - , а не что-то, что вы хотите сделать в основной теме приложения - IntentService дает вам фоновый поток и автоматически останавливается, когда ваша работа завершена, поэтому вы не занимаете ОЗУ, кроме случаев, когда вы активно выполняете работу.

Для выполнения работы в целом на периодической основе используйте AlarmManager и IntentService. IntentService может, как часть своей работы, обновить виджеты приложений, если это необходимо.

+0

Загрузка не обязательно должна выполняться в определенное время, поэтому я буду использовать Handler вместо AlarmManager. Иначе: спасибо, он уточняет выделение. – Boude

+1

@Boude: «Загрузка не должна выполняться в определенное время, поэтому я буду использовать обработчик вместо AlarmManager» - как только ваш процесс будет завершен, ваш «обработчик» уйдет. 'AlarmManager' - гораздо лучшее решение для периодических загрузок, если эти загрузки должны появиться, даже если ваш пользовательский интерфейс не находится на переднем плане. – CommonsWare

+0

Загрузка должна выполняться при видимости виджета. Только когда активность и виджет не видны, загрузка не требуется. Я думаю, что попробую оба, проверяя свою альфу и принимаю решение, основанное на некотором опыте пользователя. Благодарю вас. – Boude

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