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();

問題は次のとおりです。

私は2つのウィジェットを持っており、R.id.whoのインテントを更新すると、必要なデータであるはずのように起動されます。ただし、R.id.what のイベントは想定どおりに発生しません。このイベントで送信されたデータは、誰が送信したかの最後の値です (つまり、最後に更新されたウィジェットの値です)。

4

2 に答える 2

1

PendingIntents を区別する必要性に関するティムの答えは正しいです。一意性の要件は仕様によるものであり、バグではなく機能です。それらが一意でない場合、Android はそれらを再利用します。

PendingIntent は、そのパラメータの少なくとも1 つが他の PendingIntent と異なる場合に一意です。あなたのコードで

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

あなたの PendingIntents は同じパラメーターで起動されるため同一です。はい、エクストラの異なるコンテンツはカウントされないようです。ティムのソリューションが機能するのは、ウィジェット インスタンスごとに異なるアクション (「foobar1」、「foobar2」など) を送信するためです。これにより、各インテントが明確になります。

カレンダー ウィジェットの各日付の PendingIntents を区別しようとしたときに、これを発見しました。1 週間に 6 週間と 7 日あり、複数のウィジェット インスタンスがある可能性があるため、ウィジェット #1 の日付 i,j とウィジェット #2 の日付 i,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は、すべてのウィジェット インスタンス間で各日付の一意性をもたらすものです。

于 2014-02-25T16:32:11.743 に答える
0

私は間違っている可能性がありますが、IIRC Android には、複数の同一の未解決の PendingIntents を許可しないバグ/癖/機能があります。

つまり、エクストラのみが異なる 2 つの保留中のインテントを作成すると、最初のインテントは忘れられ、インテントが起動すると、最後に設定されたインテントが送信されます。

偽の「アクション」を設定することでそれらを区別できると思います。これは、使用されていない間、アンドロイドが 2 つの意図が同じであると想定しないようにし、コードが期待どおりに機能するようにします。

このステートメントを下に挿入してみて、問題が解決するかどうかを確認していただけますか?

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

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

アクション文字列自体は問題ではありません。各 appwidget のインテントが一意の文字列を持つ必要があるだけで、インテントが結合されません。

于 2012-10-09T20:32:56.433 に答える