如何更新不同大小的小部件?

时间:2012-01-04 04:51:25

标签: android android-widget android-manifest android-appwidget

根据此处列出的方案how to add multiple widgets in one app?

,我的应用支持多种尺寸的小部件

它有一个抽象的BaseWidgetProvider类,可以处理所有小部件。然后通过Android Manifest中列出的空WidgetProvider1 / 2/3/4类(每个大小一个)进行子类化,一切正常。清单中的注册看起来像这样(典型的是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. 有没有办法让一个接收器更新所有四种尺寸的小部件实例?

  4. 请注意,基本提供程序类不关心窗口小部件的大小,并且对所有大小都完全相同。唯一的区别是用户屏幕上的初始窗口小部件大小。如果用户调整窗口小部件的大小(例如使用Launcher Pro),它就可以正常工作。

1 个答案:

答案 0 :(得分:3)

将具有一个intent动作的intent过滤器添加到Manifest文件中所有窗口小部件提供程序的声明中,例如:

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

然后只需从您的应用程序发送此意图作为广播。 在这种情况下,意图将由所有窗口小部件提供程序处理。