Как обновить виджеты разных размеров? - PullRequest
1 голос
/ 04 января 2012

Мое приложение поддерживает виджеты нескольких размеров по схеме, изложенной здесь как добавить несколько виджетов в одном приложении?

Он имеет единственный абстрактный класс BaseWidgetProvider, который обрабатывает все виджеты. Затем он подклассируется пустыми классами WidgetProvider1 / 2/3/4 (по одному на размер), которые перечислены в манифесте Android, и все работает просто отлично. Регистрация в манифесте выглядит так (типично для 1..4)

<receiver
    android:name=".widget.MyWidgetProvider4"
    android:label="My Widget size 4" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <intent-filter>
        <action  
            android:name="my.domain.BaseWidgetProvider.UPDATE_WIDGET" />
    </intent-filter>
    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/my_widget_info4" />
    </receiver>

Мой вопрос касается отправки намерения из приложения обновить виджеты новыми данными. Я не смог найти способ отправить одно намерение для всех 4 провайдеров, и в настоящее время я отправляю 4 отдельных намерения каждый раз

for (Class cls : BaseWidgetProvider.WIDGET_PROVIDER_CLASSES) {
   Intent intent = new Intent(mApp.context(), cls);
   intent.setAction(BaseWidgetProvider.UPDATE_WIDGET);
       this.sendBroadcast(intent);
}

, где

public static final Class[] WIDGET_PROVIDER_CLASSES = new Class[] {
    WidgetProvider4.class,
    WidgetProvider1.class,
    WidgetProvider2.class,
    WidgetProvider3.class      
};
  1. Это лучший способ отправить намерение обновления для всех размеров виджетов (обратите внимание, что обычно у пользователя только ноль или один виджет)?

  2. Есть ли разумный способ отправить только одно намерение?

  3. Есть ли способ иметь один приемник, который будет обновлять экземпляры виджетов всех четырех размеров?

Обратите внимание, что базовый класс провайдера не заботится о размере виджета и делает то же самое для всех размеров. Единственная разница - начальный размер виджета на экране пользователя. Если пользователь изменяет размер виджета (например, с помощью Launcher Pro), он работает просто отлично.

1 Ответ

3 голосов
/ 04 января 2012

Добавьте фильтр намерений с одним действием намерения в объявления всех ваших поставщиков виджетов в файле манифеста, например ::

   <intent-filter>
        <action android:name="my.domain.blablabla.MY_SUPER_INTENT_TO_UPDATE_ALL" />
    </intent-filter>

А затем просто отправьте это намерение из вашего приложения в виде трансляции. В этом случае намерение будет обработано всеми вашими поставщиками виджетов.

...