疑惑:为什么你不只是覆盖的的onReceive()方法WidgetProvider?由于AppWidgetProvider是从BroadcastReceiver扩展的,所以只要调用super.onReceive(),就完全合法。
你通过的onReceive得到(意图)包含Widget的ID作为一个额外的,如果它被称为由AppWidgetHost(启动)。如果你自己调用它,你必须自己添加所需的附加功能。
这看起来是同时保持其原有的功能从任何其他活动触发WidgetProvider一种优雅的方式。
记住:的AppWidgetProvider是一个方便的类的Widgets容易发展,但到核心,它只是一个广播接收器。
我解决了它这样的:
public class WidgetProvider extends AppWidgetProvider {
public static final String ACTION_RESTART_SERVICE = "ACTION_RESTART_SERVICE";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onEnabled() called.");
if (intent.getAction() != null && intent.getAction().equals(WidgetProvider.ACTION_RESTART_SERVICE))
{
// Start service
Log.d(TAG, "ACTION_RESTART_SERVICE... Restarting service with designated update interval...");
Intent i = new Intent(context, UpdateWidgetService.class);
service = startService(i, context, service);
} else
{
// Other intent, call super class
Log.d(TAG, "Not ACTION_RESTART_SERVICE... calling superclass onReceive()...");
super.onReceive(context, intent);
}
}
}
而在你的活动/片段:
/**
* Restart the update service via WidgetProvider to reflect new profile and settings
* @param context Context is required
*/
private void restartService(Context context)
{
Intent intent = new Intent(context,
WidgetProvider.class);
intent.setAction(WidgetProvider.ACTION_RESTART_SERVICE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
{
// Send intents to all widget provider classes
intent.setClass(context, WidgetProviderSize1.class);
getActivity().sendBroadcast(intent);
intent.setClass(context, WidgetProviderSize2.class);
getActivity().sendBroadcast(intent);
intent.setClass(context, WidgetProviderSize3.class);
getActivity().sendBroadcast(intent);
intent.setClass(context, WidgetProviderSize4.class);
getActivity().sendBroadcast(intent);
intent.setClass(context, WidgetProviderSize5.class);
getActivity().sendBroadcast(intent);
} else
getActivity().sendBroadcast(intent);
}
看起来有点复杂,因为我有豆形软糖动态可调整大小的小部件和固定低于部件尺寸操作系统版本,但解决方案应该清楚。
更简单的解决方案可能是发送一个android.appwidget.action.APPWIDGET_UPDATE广播意图,就像启动器直接触发WidgetProvider的onUpdate()一样。
然后有一个完全不同的选项可用:让Updateservice自己获取WidgetID,因此不需要从更新意图中获取它们。这是确定的,如果所有的部件basicly共享相同的配置,并且如果配置有什么变化都应该被更新:
/**
* Get all Widget IDs of WidgetProviders used by this app
* @param appWidgetManager AppWidgetManager to use
* @return Array of widget IDs
*/
private int[] getAppWidgetIDs(AppWidgetManager appWidgetManager)
{
int[] widgetIdsOfOneProviderSize1 = getAppIdsOfSingleProvider(appWidgetManager, WidgetProviderSize1.class);
int[] widgetIdsOfOneProviderSize2 = getAppIdsOfSingleProvider(appWidgetManager, WidgetProviderSize2.class);
int[] widgetIdsOfOneProviderSize3 = getAppIdsOfSingleProvider(appWidgetManager, WidgetProviderSize3.class);
int[] widgetIdsOfOneProviderSize4 = getAppIdsOfSingleProvider(appWidgetManager, WidgetProviderSize4.class);
int[] widgetIdsOfOneProviderSize5 = getAppIdsOfSingleProvider(appWidgetManager, WidgetProviderSize5.class);
int[] widgetIdsOfOneProvider = getAppIdsOfSingleProvider(appWidgetManager, WidgetProvider.class);
int allWidgetIds[] = new int[widgetIdsOfOneProviderSize1.length + widgetIdsOfOneProviderSize2.length
+ widgetIdsOfOneProviderSize3.length + widgetIdsOfOneProviderSize4.length
+ widgetIdsOfOneProviderSize5.length + widgetIdsOfOneProvider.length];
int index = 0;
for (int id : widgetIdsOfOneProviderSize1)
{
allWidgetIds[index] = id;
index ++;
}
for (int id : widgetIdsOfOneProviderSize2)
{
allWidgetIds[index] = id;
index ++;
}
for (int id : widgetIdsOfOneProviderSize3)
{
allWidgetIds[index] = id;
index ++;
}
for (int id : widgetIdsOfOneProviderSize4)
{
allWidgetIds[index] = id;
index ++;
}
for (int id : widgetIdsOfOneProviderSize5)
{
allWidgetIds[index] = id;
index ++;
}
for (int id : widgetIdsOfOneProvider)
{
allWidgetIds[index] = id;
index ++;
}
return allWidgetIds;
}
private int[] getAppIdsOfSingleProvider(AppWidgetManager appWidgetManager, Class cls)
{
ComponentName thisWidget = new ComponentName(getApplicationContext(),
cls);
int[] widgetIdsOfOneProvider = appWidgetManager.getAppWidgetIds(thisWidget);
return widgetIdsOfOneProvider;
}
是的,我已经使用ArrayUtils把阵列一起......还有改进的余地; - )
同样的问题在这里... –