Вам нужно определение получателя для каждого типа в файле манифеста, например:
<receiver android:name=".MyWidget" android:label="@string/medium_widget_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/medium_widget_provider" />
</receiver>
<receiver android:name=".MyWidget" android:label="@string/large_widget_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/large_widget_provider" />
</receiver>
Это позволит вам использовать один и тот же класс AppWidgetProvider
для нескольких виджетов с разными именами виджетов и разными размерами, определенными в <appwidget-provider>
XML.
Теперь, если вам нужно больше различий в ваших виджетах, чем в <appwidget-provider>
XML, я бы создал базовый класс виджетов, который реализует все общее поведение между различными типами:
public abstract class MyBaseWidget extends AppWidgetProvider
И тогда каждая из ваших конкретных реализаций может расширять MyBaseWidget. Тогда в вашем файле манифеста у вас будет определение получателя для каждой конкретной реализации, например:
<receiver android:name=".MyMediumWidget" android:label="@string/medium_widget_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/medium_widget_provider" />
</receiver>
<receiver android:name=".MyLargeWidget" android:label="@string/large_widget_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/large_widget_provider" />
</receiver>