2010-10-25 51 views
18

我有一個WidgetProvider和配置活動多個實例的Widget只更新最新插件

當小部件啓動其與配置活動的開始,我把它通過使一個自定義調用widgetprovider

(你會發現是從SDK實例教程)

// Push widget update to surface with newly set prefix 
       AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
       AwarenessWidget.updateAppWidget(context, appWidgetManager, 
         mAppWidgetId, position); 

      // Make sure we pass back the original appWidgetId 
      Intent resultValue = new Intent(); 
      resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 
      setResult(RESULT_OK, resultValue); 
      finish(); 

我通過微件ID的函數....微件內我創建這樣的意圖:

Intent configIntent = new Intent(context, Configure.class); 
    configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 

    PendingIntent pendingIntent = PendingIntent.getActivity 
    (context, 0, configIntent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 

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

    views.setImageViewResource(R.id.MainImage, lv_images[version]); 

    appWidgetManager.updateAppWidget(appWidgetId, views); 

我總是引用控件ID,甚至將其添加爲一個額外的意圖 但是當我得到兩個這些小部件的主屏幕小部件I​​D始終引用最後放置控件ID

回答

49

上我有類似的問題。只需添加到您的配置活動,在這裏您設置的PendingIntent:

Uri data = Uri.withAppendedPath(
    Uri.parse(URI_SCHEME + "://widget/id/") 
    ,String.valueOf(appWidgetId)); 
intent.setData(data); 

變量URI_SCHEME是一個字符串,可以是你想什麼..即 - 「ABCD」這將導致每個插件有獨特的PendingIntent。

+0

我沒有設置的PendingIntent在我的配置活動,只有在該活動呼籲 – morty346 2010-10-25 02:25:55

+0

OK,只是出於它在我的小部件功能部件的功能和它工作 – morty346 2010-10-25 02:32:19

+2

+1尼斯破解:) – 2011-06-10 08:54:44

36

下面是關於爲什麼你的代碼不起作用以及如何解決它的更深入的解釋。從Android SDK文檔:

甲的PendingIntent本身是簡單地通過 描述用於檢索它的原始數據的系統所維護的令牌的引用。這個 意味着,即使其擁有的應用程序的進程被終止,PendingIntent本身仍然可以從其他進程中獲得 。如果稍後創建的應用程序重新獲取PendingIntent(相同的操作,相同的意圖操作,數據, 類別和組件以及相同的標誌)相同的 PendingIntent,它將收到代表相同標記的PendingIntent(如果該標識仍然有效) ,並且 可以因此調用cancel()來移除它。

由於這種行爲,知道何時兩個意圖 被視爲用於檢索PendingIntent的目的是相同的,這一點很重要。 人們犯的一個常見錯誤是創建多個PendingIntent 對象,其Intents只在其「額外」內容中有所不同, 期望每次都獲得不同的PendingIntent。這不會發生 。用於匹配的意圖部分是由Intent.filterEquals定義的相同的那部分 。如果您使用兩個與Intent.filterEquals等效的Intent 對象,那麼您將爲它們兩個獲得相同的PendingIntent。

請注意,指定不同的「額外」內容不足以讓PendingIntents被視爲唯一的,但是使用setData設置唯一的URI是。這就是爲什麼Snailer的URI解決方案「神奇地」修復了這個問題。

該文檔還提供了一種不同的(可以說更簡單的)解決方案。而不是創建一個自定義的URI只是設置一個唯一的requestCode當你調用getActivity的:

PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

來源:http://developer.android.com/reference/android/app/PendingIntent.html

+0

從SDK中,似乎requestCode目前未被使用... – ken 2013-01-25 02:24:00

+1

requestCode目前未被SDK使用,但它確實導致Intent被認爲是唯一的。該文檔建議這是requestCode的有效使用:「或提供給getActivity的不同請求代碼整數」 – 2013-01-25 21:09:36

+0

真棒,非常有用 – Dima 2016-08-29 00:09:51

10

在我的測試,使用上的PendingIntent使用setData(...)沒有解決在運行Android 4.0.4的Verizon Thunderbolt上出現問題。它適用於我的其他測試設備和仿真器。

我測試了requestCode的用法,而且它適用於所有情況。我剛纔設置的requestCode是控件ID:

pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
+1

偉大的解決方案。需要數小時才能找到。非常感謝。 – 2014-01-14 13:27:12