我有多个小部件。在更新每个i时,启动服务中的服务代码:
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 :(得分:0)
我可能错了,但是IIRC Android有一个错误/怪癖/功能,它不会让你拥有多个相同的优秀PendingIntents。
这意味着如果您创建两个仅由附加项不同的待处理意图,则第一个意图将被遗忘,当意图触发时,它将发送最后设置的意图。
我认为你可以通过设置一个虚假的“动作”来区分它们,虽然未使用,导致android不会假设两个意图是相同的,并且你的代码将按照你期望的方式工作。
您可以尝试在下面插入此声明,看看是否可以解决您的问题吗?
Intent clickIntentUpdate1 = new Intent(
this.getApplicationContext(), DisplayActivity.class);
clickIndentUpdate1.setAction("foobar" + String.valueOf(widgetId)); //NEW LINE
动作字符串本身并不重要,您只需要每个appwidget有一个唯一字符串,以便不会合并意图。
答案 1 :(得分:0)
当PendingIntent的参数中至少一个与其他PendingIntents不同时,PendingIntent是唯一的。在你的代码中
PendingIntent pendingIntentUpdate1 = PendingIntent.getActivity(
getApplicationContext(), 0, clickIntentUpdate1,
PendingIntent.FLAG_UPDATE_CURRENT);
您的PendingIntents是相同的,因为它们是使用相同的参数启动的,是的,似乎额外内容中的不同内容不计算在内。 Tim的解决方案有效,因为它为每个小部件实例发送了不同的动作:“foobar1”,“foobar2”等。这使得每个小部件都不同。
我在尝试区分日历小部件中每个日期的PendingIntents时发现了这一点。由于它每周有6周和7天,并且可能有多个小部件实例,因此我需要在日期i,j中从日期i,j在小部件#2上的小部件#j中进行不同的挖掘,对于每一个可能的42种组合。
我通过为每个资源标识符(日期)分配不同的requestCode
(第二个参数)来解决这个问题:
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
为所有窗口小部件实例中的每个日期带来唯一性。