疑惑:爲什麼你不只是覆蓋的的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把陣列一起......還有改進的餘地; - )
同樣的問題在這裏... –