簡體   English   中英

小部件的多個實例僅更新最后一個小部件

[英]Multiple Instances Of Widget Only Updating Last widget

我有一個WidgetProvider和一個Configure活動

啟動Widget時,它將以configure活動開始,我通過對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,如下所示:

  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,甚至在意圖上將其添加為一個額外的內容,但是當我在主屏幕上看到其中兩個窗口小部件時,窗口小部件ID總是引用最后放置的窗口小部件ID。

我有一個類似的問題。 只需將其添加到配置活動中,即可在其中設置PendingIntent:

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

變量URI_SCHEME是一個字符串,並且可以是您想要的任何內容。即-“ ABCD”這將導致每個小部件具有唯一的PendingIntent。

這里是有關您的代碼為什么不起作用以及如何解決它的更深入的解釋。 從Android SDK文檔中:

PendingIntent本身只是對系統維護的令牌的引用,該令牌描述了用於檢索令牌的原始數據。 這意味着,即使其擁有的應用程序的進程被殺死,PendingIntent本身也將在已賦予它的其他進程中保持可用。 如果創建的應用程序以后重新檢索相同類型的PendingIntent(相同的操作,相同的Intent操作,數據,類別和組件以及相同的標志),則它將收到表示相同令牌的PendingIntent(如果該令牌仍然有效),並且可以因此調用cancel()將其刪除。

由於這種行為,重要的是要知道何時將兩個Intent視為相同,以便檢索PendingIntent。 人們經常犯的一個錯誤是創建多個PendingIntent對象,它們的Intent僅在其“額外”內容中有所不同,期望每次都獲得一個不同的PendingIntent。 這不會發生。 Intent中用於匹配的部分與Intent.filterEquals定義的部分相同。 如果您使用與Intent.filterEquals等效的兩個Intent對象,則它們將獲得相同的PendingIntent。

請注意,僅指定不同的“額外”內容不足以將PendingIntents視為唯一,但是使用setData設置唯一URI即可。 這就是Snailer的URI解決方案“神奇地”解決了該問題的原因。

該文檔還為該問題提供了另一種(可能更簡單)的解決方案。 無需創建自定義URI,只需在調用getActivity時設置唯一的requestCode即可:

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

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

在我的測試中,在PendingIntent上使用setData(...)不能解決運行Android 4.0.4的Verizon Thunderbolt上的問題。 它可以在我的其他測試設備和仿真器上運行。

我測試了requestCode的使用,並且在所有情況下都可以使用。 我只是將requestCode設置為小部件ID:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM