0

我有多个小部件。在每次更新时,我都会在服务中启动一个服务代码:

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 的事件并没有按预期触发。在此事件上发送的数据是发送内容和发送的最后一个值(即最后一个要更新的小部件中的值。)

4

2 回答 2

1

关于需要区分 PendingIntents,Tim 的回答是正确的。唯一性要求是设计使然,它是功能而不是错误。当它们不是唯一的时,Android 会重用它们。

当 PendingIntent 的至少一个参数与其他 PendingIntent 不同时,PendingIntent 是唯一的。在您的代码中

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

您的 PendingIntents 是相同的,因为它们是使用相同的参数启动的,是的,似乎 extras 中的不同内容不算在内。Tim 的解决方案之所以有效,是因为它为每个小部件实例发送不同的操作:“foobar1”、“foobar2”等。这使得每个意图都不同。

我在尝试区分日历小部件中每个日期的 PendingIntents 时发现了这一点。由于它每周有 6 周和 7 天,并且可能有多个小部件实例,因此我需要区分小部件 #1 上的日期 i,j 与小部件 #2 上的日期 i,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为所有小部件实例中的每个日期带来唯一性。

于 2014-02-25T16:32:11.743 回答
0

我可能是错的,但 IIRC Android 有一个错误/怪癖/功能,它不允许您拥有多个相同的未完成 PendingIntents。

这意味着,如果您创建两个仅在附加方面有所不同的待处理意图,则第一个将被遗忘,并且当意图触发时,它将发送设置的最后一个意图。

我认为您可以通过设置一个虚假的“动作”来区分它们,虽然未使用,但会导致 android 不认为这两个意图是相同的,并且您的代码将按照您的预期工作。

您可以尝试在下面插入此语句,看看是否能解决您的问题?

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

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

动作字符串本身并不重要,你只需要每个appwidget的intent都有一个唯一的字符串,这样intent就不会被合并。

于 2012-10-09T20:32:56.433 回答