Как правильно сделать виджет, который меняет содержимое каждые 6-8 секунд, Android

Ближайший пример того, что я хочу сделать, — это виджет «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 продолжает работать после того, как я удаляю виджет.


person weakwire    schedule 23.09.2010    source источник
comment
Запустите службу, которая отправляет широковещательную рассылку, которую прослушивает виджет.   -  person Falmarri    schedule 24.09.2010


Ответы (2)


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

person adamp    schedule 23.09.2010
comment
можно ли использовать ViewFlipper в виджете? - person weakwire; 24.09.2010
comment
developer.android.com/guide/topics/appwidgets/ h, я нигде не вижу ViewFlipper.. - person weakwire; 24.09.2010
comment
Документация по этой ссылке устарела. Начиная с API 7 (Android 2.1) ViewFlipper можно использовать в виджетах. (Стандартный виджет «Новости и погода» использует его именно по той причине, которую вы описываете.) - person adamp; 24.09.2010

Все, что работает непрерывно (например, mp3-плеер или радио) или требует какой-либо формы опроса (будильник, виджет отображения SO, ошибка погоды), должно быть написано как служба. Я знаю, что это устарело, но посмотрите эти видеоролики для получения дополнительной информации о передовых методах
http://developer.android.com/videos/index.html#v=M1ZBjlCRfz0

person Terrance    schedule 13.12.2010