2012-12-13 32 views
0

我注意到,無論何時將相同AppWidget的新實例添加到主屏幕,都會調用合適的AppWidgetProvideronUpdate方法,其代碼爲。爲什麼AppWidgetProvider.onUpdate在添加新的widget時調用了所有的widget實例?

reference明確指出:

EXTRA_APPWIDGET_IDS的appWidgetIds更新。這可能是爲此提供者創建的所有 AppWidgets,或者只是一個子集。系統 嘗試儘可能少地發送AppWidget實例的更新。

這種行爲是故意的嗎?

有沒有辦法強制onUpdate只能用適當的ID來調用?

是否有辦法區分受影響的實例和其他實例?

回答

1

創建窗口小部件有兩種選擇: 第一種選擇是不使用配置活動,然後所有窗口小部件的行爲都相似,並且它們都可以一次更新而沒有區別。 第二個是使用配置活動。在那裏你可以得到的只是被調用的配置活動被創建的小部件ID:

Intent intent = getIntent(); 
Bundle extras = intent.getExtras(); 
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

您可以在源碼這是同時的配置步驟定義例如與這個小部件等信息堅持這個小工具的ID 。

因此,對於你的問題:

這種行爲是故意的嗎?

我認爲答案 - '是'。因爲在沒有配置步驟的情況下創建的小部件應該表現相似,並且在AppWidgetProviderInfo中以updatePeriodMillis屬性定義的間隔調用onUpdate

有沒有辦法強制onUpdate只能用適當的ID來調用?

編號from doc我可以知道這樣的選項不存在。

是否有辦法區分受影響的實例與其他實例?

是的,你可以決定何時更新哪個小部件。您可以通過在提供程序提供程序類中使用onRecieve來實現此目的:

  • 使用配置活動並保留每個小組件標識。 或者將待定意圖設置爲小部件中的onClick事件,並將此意圖內的小部件ID傳遞給活動,然後將其保留。這個想法 - 保存小部件ID,只是爲了稍後能夠區分它們。
  • 從您的應用程序(活動,服務,報警管理器)發送您想要更新的小部件ID的廣播。
  • onRecieve將捕獲廣播,將獲取小部件ID,然後您可以使用小部件提供程序類中的具體小部件。
+0

謝謝,我打算寫一個配置活動。我仍然認爲這種行爲很奇怪。小部件實例確實共享行爲但不是狀態。更新狀態時,無需使用不必要的系統資源。我看不出如何添加新實例將需要其他實例更新。 – Xyand

相關問題