satohu20xx's diary

思ったことをつらつらと

Status Barの値を更新してもgetExtra()で取得できる値が変わらない

NotificationManagerを使用してStatus Barに表示する値は変わるけど、getExtra()で渡ってくる値が変わらないのですごく悩んだ。

変更出来なかったコードは以下。

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

これで更新するとStatus Barの値とか通知バーの値が変わるからこれでgetExtra()で渡ってくる値も変わるかと思ったけど、これだとPendingIntentが更新されない。どうも第4引数で渡すフラグが原因みたい。
第4引数のFlagで渡せる値には以下のものがある。

  • LAG_CANCEL_CURRENT(0x10000000):記述された PendingIntent がすでに存在していた場合、新しいのが生成される前に現在のはキャンセルされる
  • FLAG_NO_CREATE(0x20000000):記述された PendingIntent がまだ存在していない場合、生成せずに単に null を返す。
  • FLAG_ONE_SHOT(0x40000000):この PendingIntent は1度だけ使える。このフラグがセットされた場合、send() が呼ばれた後に試みた send は自動的にキャンセルされる。
  • FLAG_UPDATE_CURRENT(0x08000000):記述された PendingIntent がすでに存在している場合、それをキープして extra data を新しい Intent のものに置き換える。

ってことで、変更出来なかったコードで渡している0って言うものはない。だから、Flagのなにが使用されているのかがわからない。挙動からみるとデフォルト値はFLAG_NO_CREATEが設定されていると思われる。このせいで新たにPendingIntentが生成されずに最初に作成したPendingIntentが使用されるのでgetExtra()で取得される値が変わらないって仕組み。

なので、以下のコードに書き換える。

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

これで正常に渡される。

ちなみに第2引数はrequestCodeってなっている。同一のアプリケーションで複数のPendingIntentを使用する場合はこの値を変えることで複数のPendingIntentを作成することができるみたい。

やっぱりコードのコピペをするんじゃなくて引数全てをきちんと調べる必要があるよなー