模糊更新多个AppWidgets

时间:2012-10-09 19:35:59

标签: android android-appwidget

我有多个小部件。在更新每个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的事件并没有被解雇,因为它应该是。在此事件上发送的数据是 发送的最后一个值(即最后一个要更新的小部件中的值)。

2 个答案:

答案 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)

关于区分PendingIntents的必要性,Tim的回答是正确的。唯一性要求是设计,它是一个功能而不是一个bug。如果它们不是唯一的,Android会重复使用它们。

当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为所有窗口小部件实例中的每个日期带来唯一性。