2010-08-25 128 views
9

想要我的小部件中的按鈕觸發小部件類上的APPWIDGET_UPDATE意圖來強制更新,但我沒有將APPWIDGET_UPDATE看作Intent中的靜態字段。是否有可能以編程方式拋出APPWIDGET_UPDATE的意圖?

這是可能的,以及如何做到這一點?

Intent intent = new Intent(context, BaseWidgetProvider.class); 
intent.setAction({APPWIDGET_UPDATE INTENT HERE}) 
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

views.setOnClickPendingIntent(R.id.MyWidgetButton, pendingIntent); 

回答

15

是的,這是可能的。你會在AppWidgetManager找到行動:

intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE)

編輯:您將需要提供您要更新的控件的ID。以下是一個完整的示例。

AppWidgetManager widgetManager = AppWidgetManager.getInstance(context); 
ComponentName widgetComponent = new ComponentName(context, YourWidget.class); 
int[] widgetIds = widgetManager.getAppWidgetIds(widgetComponent); 
Intent update = new Intent(); 
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds); 
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
context.sendBroadcast(update); 
+0

謝謝。我在adb logcat中看到了意圖觸發器,但小部件不會更新。還有什麼我應該做的?我的APPWIDGET_UPDATE已經作爲我的清單文件中的intent過濾器了。 – NPike 2010-08-25 21:12:23

+0

'onUpdate()'不被調用?我必須就此回覆你。 – Justin 2010-08-28 13:36:17

+0

您將需要提供更新的小部件的ID。如果你想更新你的小部件的所有實例,你可以從'AppWidgetManager'獲得一個完整的id列表(我編輯了我的註釋以包含代碼)。 – Justin 2010-08-30 19:13:56

2

我知道這是一個很老的問題,但我認爲這可能很有趣,因爲Android更新了AppWidgets刷新策略。我認爲這種改變可能會阻止現有的答案按預期工作。

這是我的解決方案,使用RemoteViews和一個集合。

public static final String ACTION_WIDGET_UPDATE = "com.yourpackage.widget.ACTION_UPDATE"; 

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ACTION_WIDGET_UPDATE)) { 
     int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); 
     AppWidgetManager.getInstance(context) 
       .notifyAppWidgetViewDataChanged(widgetId, R.id.widgetColectionRoot); 
    } 
    super.onReceive(context, intent); 
} 

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
        int[] appWidgetIds) { 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
    for (int widgetId : appWidgetIds) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      RemoteViews collectionRemoteView = getRemoteViews(widgetId, context); 
      appWidgetManager.updateAppWidget(widgetId, collectionRemoteView); 
     } 

    } 
} 

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
@SuppressWarnings("deprecation") 
private RemoteViews getRemoteViews(int widgetId, Context context) { 
    // Sets up the intent that points to the RemoteViewService 
    // that will 
    // provide the views for this collection. 
    Intent widgetUpdateServiceIntent = new Intent(context, 
      RemoteViewsService.class); 
    widgetUpdateServiceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
    // When intents are compared, the extras are ignored, so we need 
    // to embed the extras 
    // into the data so that the extras will not be ignored. 
    widgetUpdateServiceIntent.setData(
      Uri.parse(widgetUpdateServiceIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    RemoteViews collectionRemoteView = new RemoteViews(context.getPackageName(), 
      R.layout.widget_collection); 
    collectionRemoteView.setRemoteAdapter(widgetId, 
      R.id.widgetColectionRoot, widgetUpdateServiceIntent); 

    collectionRemoteView.setEmptyView(R.id.widgetColectionRoot, R.id.widgetEmpty); 

    // This section makes it possible for items to have 
    // individualized behavior. 
    // It does this by setting up a pending intent template. 
    // Individuals items of a collection 
    // cannot set up their own pending intents. Instead, the 
    // collection as a whole sets 
    // up a pending intent template, and the individual items set a 
    // fillInIntent 
    // to create unique behavior on an item-by-item basis. 
    Intent selectItemIntent = new Intent(context, 
      BrochuresWidgetProvider.class); 

    Intent refreshIntent = new Intent(selectItemIntent); 
    refreshIntent.setAction(ACTION_WIDGET_UPDATE); 
    PendingIntent refreshPendingIntent = PendingIntent.getBroadcast(
      context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    collectionRemoteView.setOnClickPendingIntent(R.id.widgetReload, 
      refreshPendingIntent); 
    return collectionRemoteView; 
} 

當然,你還需要註冊的意圖過濾器在你的清單,你的控件提供的聲明中。

相關問題