63

数日前、アラームにカスタムインテントを使用する方法を見つけるのに苦労していました。明確な答えを得ましたが、たとえば、いくつかの一意の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番目のメッセージが生成されると、通知は適切に発生しますが(メッセージは問題ありません)、ユーザーが通知を実行すると、古いデータが使用されるため、新しいメッセージではなく前のメッセージが渡されます。

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

4

2 に答える 2

101

PendingIntents任意の時点でこの連絡先の 1 つだけが未処理である場合、または常に最新のエクストラ セットを使用したい場合FLAG_UPDATE_CURRENTは、PendingIntent.

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

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

アップデート

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

于 2010-06-29T11:56:14.800 に答える
38

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

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

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

于 2010-06-29T12:16:23.493 に答える