Обновление виджетов из службы через RemoteViews — нормально на телефоне, не работает на эмуляторе

#android #service #emulation #widget #remoteview

#Android #Обслуживание #эмуляция #виджет #remoteview

Вопрос:

Я создал WidgetProvider и службу, которая запускается при системном TIME_TICK — эта часть работает нормально, сообщения журнала показывают, что служба работает нормально, и она отлично смотрится на реальном телефоне.

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

     Log.d("xxx","Updating");
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
    views.setTextViewText(R.id.appwidget_text, "Some Text"   System.currentTimeMillis());
    ComponentName thisWidget = new ComponentName(context, SWClockWidgetProvider.class);
    AppWidgetManager manager = AppWidgetManager.getInstance(context);
    manager.updateAppWidget(thisWidget, views);
  

На моем телефоне (HTC Desire под управлением 2.2) все идеально, виджеты обновляются мгновенно, каждую минуту.

На эмуляторе (работает 2.2) Появляются сообщения журнала (например, служба работает), но виджеты не обновляются.

Теперь я вызываю этот код в 2 местах — из метода onUpdate поставщика (чтобы он помещал что-то в виджеты при их первом отображении) и из прослушивателя службы (для их обновления)

Теперь вот что странно — в моем манифесте я изначально объявил свой сервис следующим образом

служба android: name =».SWClockWidgetService»

Когда я изменил это, чтобы явно указать пакет (который, конечно, идентичен пакету провайдера)

служба android: name =»com.somewhatdog.swclockwidget.SWClockWidgetService»

первоначальное обновление (вызываемое поставщиком onUpdate) работает, НО последующие вызовы от слушателя службы по-прежнему не работают !?

Примечание: Первоначально я сделал службу внутренним классом провайдера, но это не работало на телефоне ИЛИ эмуляторе — понятия не имею, связано ли это…

В любом случае — я озадачен — тот же Android на телефоне и эмуляторе — один работает, другой нет (что означает, что шансы на то, что это сработает на других устройствах, мягко говоря, капризны ??)

Я здесь более чем немного потерян — любой совет приветствуется.

p.s. Я тестировал это на эмуляторе под управлением 1.6 без радости — он работает на эмуляторе под управлением 2.1r1 и 2.3.3 tho, так что кто знает…

Комментарии:

1. Я знаю, что уже поздно, но просто хочу сообщить вам, что теперь вы можете работать с виджетами на эмуляторе под названием Genymotion, он работает довольно хорошо.

Ответ №1:

Обновление виджета эмулятора кажется немного запутанным. С этим связаны две известные проблемы:

  1. updateAppWidget(...) вызовы могут работать только на эмуляторах, которые были перезапущены хотя бы один раз.
  2. Одновременный запуск более одного эмулятора может помешать обновлению виджета.

Ответ №2:

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

Даже если вы развернете новый код, существующие виджеты останутся неизменными!

Тестирование с использованием Androidx86 предполагает, что проблема связана с эмулятором, поэтому я думаю, что вместо этого я буду использовать это для тестирования виджетов…