Ближайший пример того, что я хочу сделать, — это виджет «Engadget». Он обновляет свои данные из Интернета каждые 5-10 минут и «прокручивает» истории каждые 5-7 секунд. Я предполагаю, что он устанавливает интервал 5-10 минут для widget's provider
для вызова onUpdate без встроенных ограничений, что-то в этом роде..
AlarmManager alarms = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), updateRateSeconds * 1000, newPending);
Тогда реальная проблема... обновить содержимое виджетов без вызова onUpdate.
Здесь я представляю, что внутри поставщика виджетов существует таймер или Runnable, который каждый раз, когда он вызывается, переназначает себя с чем-то вроде этого
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
...
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.postDelayed(mUpdateTimeTask, 1000);
}
.
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
final long start = mStartTime;
long millis = SystemClock.uptimeMillis() - start;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
...
mHandler.postAtTime(this,start + (((minutes * 60) + seconds + 1) * 1000));
}
Затем в провайдере виджетов внутри onDeleted
и onDisabled
я удаляю обратные вызовы mHandler.removeCallbacks(mUpdateTimeTask);
Что-то не так с этой схемой? Нужно ли мне создавать службу для обновления виджета оттуда и поддерживать его работоспособность, не устанавливая AlarmManager
в конфигурацию виджета? По какой-то причине я получаю двойные вызовы onUpdate
, и runnable продолжает работать после того, как я удаляю виджет.