2012-10-09 65 views
0

我有多個部件。在更新每個i在服務啓動服務代碼:歧義更新多AppWidgets

for (int widgetId : allWidgetIds) { 

// Register an onClickListener for DisplayActivity 
      Intent clickIntentUpdate1 = new Intent(
        this.getApplicationContext(), DisplayActivity.class); 
      clickIntentUpdate1.putExtra("widgetid", widgetId); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHAT, what); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHAT_COLOR, prefs 
        .getString(QuoteConfigure.PREF_PREFIX_KEY_QUOTE_COLOR 
          + widgetId, "Transparent")); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHO, who); 
      clickIntentUpdate1.putExtra(DisplayActivity.WHO_COLOR, prefs 
        .getString(
          QuoteConfigure.PREF_PREFIX_KEY_QUOTE_BY_COLOR 
            + widgetId, "Transparent")); 
      clickIntentUpdate1.putExtra(
        DisplayActivity.BG_COLOR, 
        prefs.getString(QuoteConfigure.PREF_PREFIX_KEY_QUOTE_BG 
          + widgetId, "Transparent")); 
      PendingIntent pendingIntentUpdate1 = PendingIntent.getActivity(
        getApplicationContext(), 0, clickIntentUpdate1, 
        PendingIntent.FLAG_UPDATE_CURRENT); 
      remoteViews.setOnClickPendingIntent(R.id.what, 
        pendingIntentUpdate1); 
      Log.d("quoteSERVICE", what + " -> " + who); 
      Log.d("quoteSERVICE", "what inside intent:"+clickIntentUpdate1.getExtras().getString(DisplayActivity.WHAT)); 
      Log.d("quoteSERVICE", "widgetid:"+widgetId); 
      Log.d("quoteSERVICE", "--------------------"); 

      // Register an onClickListener for Who search 
      Intent clickIntentSearch = new Intent(Intent.ACTION_VIEW); 
      clickIntentSearch.setData(Uri 
        .parse("http://www.google.com/search?q=" + who)); 
      PendingIntent pendingIntentSearch = PendingIntent.getActivity(
        getApplicationContext(), 0, clickIntentSearch, 0); 
      remoteViews.setOnClickPendingIntent(R.id.who, 
        pendingIntentSearch); 

      appWidgetManager.updateAppWidget(widgetId, remoteViews); 
} 
stopSelf(); 

現在的問題是:

我有兩個小部件,當他們更新R.id.who意圖,因爲它是應該被解僱與所需的數據一致。然而,R.id.what的事件並不像它應該的那樣被解僱。在這種情況下發送的數據是誰發送什麼最後的值(即在過去的控件的人來進行更新。)

回答

0

我可能是錯的,但IIRC Android有一個bug /怪癖/功能不會讓您擁有多個相同的未完成PendingIntents。

如果您創建兩個懸而未決的意圖,只有演員不同也就是說,第一個會被人遺忘,當意圖火災它將發送所設定的最後目的。

我想你可以通過設置一個假的「行動」,雖然未使用,導致機器人不承擔兩項意圖是一樣的,你的代碼將工作,你如何期望區分。

你可以試試下面插入此聲明,並看看是否能解決問題了嗎?

Intent clickIntentUpdate1 = new Intent(
       this.getApplicationContext(), DisplayActivity.class); 

clickIndentUpdate1.setAction("foobar" + String.valueOf(widgetId)); //NEW LINE 

操作字符串本身沒關係,你只需要每個appwidget的意圖有一個獨特的字符串,這樣的意圖不相結合。

+0

它確實有效。正如您的答案中所述,是否還有與小部件相關的錯誤?但是,我仍然不明白這個問題,爲什麼第一個** Intent **被遺忘了。 – harshit

+0

Android在決定PendingIntents是否唯一時似乎沒有看額外內容。因此,當它看到你創建第二個意圖時,它自己說:「這與現有的PendingIntent完全一樣嗎?是的?好的,只是將這個意圖用於這兩種情況。」我不確定這是爲什麼。 @harshit – Tim

+0

但它實際上不是。我的意思是我通過的演員是不同的。另外,它適用於我傳遞Google查詢URI的另一個意圖。怎麼來的? – harshit

0

添的回答關於有必要區分PendingIntents是正確的。唯一性要求是設計的,這是一個功能而不是bug。當它們不是唯一的時候,Android會重用它們。

PendingIntent至少在的一個的參數與其他PendingIntents不同時是唯一的。在您的代碼

PendingIntent pendingIntentUpdate1 = PendingIntent.getActivity(
        getApplicationContext(), 0, clickIntentUpdate1, 
        PendingIntent.FLAG_UPDATE_CURRENT); 

您PendingIntents是相同的,因爲它們使用相同的參數啓動,是的,它似乎在羣衆演員不同的內容不計數。 Tim的解決方案的工作原理是,它爲每個小部件實例發送不同的操作:「foobar1」,「foobar2」等。這使每個意圖都不同。

我試圖區分PendingIntents在我的日曆組件的每個日期的時候發現了這個。由於它每週有6周和7天,並且可能有多個小部件實例,所以我需要在日期i,j上自第i個窗口小部件#1開始,在小部件#2上對j中的每一個進行不同的點擊42種組合。

我解決了這個通過分配不同requestCode(第2參數),以每個資源標識符(日期):

Intent dateTapIntent = new Intent(Consts.WIDGET_CLICK_DATE) 
        .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awId) 
        .putExtra(Consts.SELECTED_DATE_EXTRA, getSelectedDate(awId, i-1, j-1)); 
int request = awId * 100 + i * 10 + j; 
rv.setOnClickPendingIntent(identifier, 
     PendingIntent.getBroadcast(mContext, request, 
            dateTapIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 

公式awId * 100 + i * 10 + j是什麼帶來的所有插件實例之間的每個日期的獨特性。