web-dev-qa-db-ja.com

android保留中のインテント通知の問題

アプリでアラームが発生し、通知が起動され、それを押すとアクティビティが起動します。問題は、複数のアラームを作成すると、通知から起動されたアクティビティが最初のアラームと同じ追加機能を取得することです。問題は、保留中のインテントに設定されたインテントまたは保留中のインテント自体にあると思います。これらのいずれかにフラグを立てる必要があるかもしれないと思いますが、どれがわからないのですか。

Intent showIntent =new Intent(context, notificationreceiver.class);
    showIntent.putExtra("details", alarmname);

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

    notification.setLatestEventInfo(context, "The event is imminent",
            alarmname, contentIntent);

そして、通知の受信者

Bundle b = getIntent().getExtras();
    String eventname = b.getString("details");
    details.setText(eventname);

「詳細」の追加は、異なる値を持つ代わりに通知が次に発生するたびに同じです。インテントを設定するまで、正しい値が「詳細」に反映されるので、通知を押すたびに最初のインテントを取得するという問題があります。正しいインテントを起動するにはどうすればよいですか?私ができる限り明確であったことを願っていますありがとう!

72
spagi

問題は、複数のアラームを作成すると、通知から起動されたアクティビティが最初のアラームと同じ追加機能を取得することです。

正しい。

正しいインテントを起動するにはどうすればよいですか?

それは、一度に登録される2つのアラームがあるかどうかによって異なります。

そうでない場合は、 _FLAG_ONE_SHOT_または他のPendingIntentフラグのいずれかを使用 で2番目のPendingIntentに新しいエクストラを使用させることができます。

ただし、異なるIntentエキストラで2つのアラームを一度に登録する場合は、2つのIntentsをより実質的に異なるものにする必要があります。たとえば、 filterEquals() は、2つの比較時にfalseを返します。たとえば、setData()またはsetAction()を呼び出して、Intentごとに異なる値を指定できます。

68
CommonsWare

私がその問題を解決したのは、PendingIntentを取得するときに一意のrequestCodeを割り当てることでした。

PendingIntent.getActivity(context, requestCode, showIntent, 0); 

そうすることで、システムに異なる/固有の意図のインスタンスを登録しています。 Tip: requestCodeを一意にする良い方法は、現在のシステム時間を渡すことです。

int requestID = (int) System.currentTimeMillis();
116
u-ramos

別のソリューション:

PendingIntent.FLAG_UPDATE_CURRENTを次のように使用します。

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);

これは私のために働いた

0
Abeer Sul

私は自分のアプリでこの問題を抱えており、通知の意図を無効にするために乱数を生成しました:

int random= new Random().nextInt();
PendingIntent resultPendingIntent =
      stackBuilder.getPendingIntent(
              random,
              PendingIntent.FLAG_UPDATE_CURRENT
      );
0
bsh