web-dev-qa-db-ja.com

Android自分のインテントエクストラをキャッシュし続ける、新しいエクストラを保持する保留中のインテントを宣言する方法は?

数日前、アラームにカスタムインテントを使用する方法を見つけるのに苦労していました。私はいくつかの一意のIDに基づいてインテントをカスタマイズする必要があるという明確な答えを得ましたが、例えば。 setAction()にはまだ問題があります。

このようにPendingIntentを定義します。

Intent intent = new Intent(this, viewContactQuick.class);
intent.setAction("newmessage"+objContact.getId());//unique per contact
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK ).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP );
intent.putExtra("id", Long.parseLong(objContact.getId()));
intent.putExtra("results", result.toArray());

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);

次に、これは通知マネージャーによって使用されます

NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
// first try to clear any active notification with this contact ID
mNotificationManager.cancel(Integer.parseInt(objContact.getId()));

// then raise a new notification for this contact ID
mNotificationManager.notify(Integer.parseInt(objContact.getId()), notification);

これは次のように機能します。

  • アプリケーションが連絡先のメッセージを作成する
  • 連絡先IDとメッセージの詳細とともにインテントが提供されます
  • 通知はメッセージで発生します
  • ユーザーが通知を操作すると、アプリがインテントから渡されたメッセージを表示します

問題

これは、連絡先に対して複数回発生する可能性があります。そして、2番目のメッセージが生成されると、通知は適切に発生します(メッセージはそこにあります)が、ユーザーが通知を操作するときに、古いデータを使用するため、新しいメッセージではなく前のメッセージが渡されます。

したがって、いずれにせよ、意図は以前のエクストラをキャッシュして再利用することです。連絡先ごと、アクションごとに一意にするにはどうすればよいですか?

62
Pentium10

この連絡先のPendingIntentsのいずれか1つだけが未処理になる場合、または常に最新の追加セットを使用する場合は、PendingIntentを作成するときにFLAG_UPDATE_CURRENTを使用します。

複数の連絡先固有のPendingIntentが一度に未処理であり、個別に追加する必要がある場合は、カウントまたはタイムスタンプなどを追加して、それらを区別する必要があります。

intent.setAction("actionstring" + System.currentTimeMillis());

[〜#〜]更新[〜#〜]

また、PendingIntentgetActivity()およびkinへの簡単に文書化された2番目のパラメーターを使用して、同じ基礎となるPendingIntentに対して別個のIntentオブジェクトを作成することができます。私はこれを試したことはありませんが。

95
CommonsWare

私は通常、PendingIntentsが互いにオーバーライドしないように、一意のrequestCodeを指定します。

PendingIntent pending = PendingIntent.getService(context, unique_id, intent, 0);

そして、あなたの場合、私はCommonsWareに同意します。FLAG_UPDATE_CURRENTフラグが必要です。新しいエクストラは古い値を上書きします。

34
Fedor