PendingIntentでデータをintentに渡す際のRequestCodeとFlagに注意。
PendingIntent を利用してデータを渡す際には、requestCode と flagという2つの引数がポイントです。
- リクエストコード(requestCode):
- リクエストコードは異なるPendingIntentを表す整数値です。
- Intentコードが異なる場合はPendingIntentオブジェクトも異なります。
- リクエストコードが同一の場合は同一のPendingIntentオブジェクトが返され、それ以降の操作で前の操作が上書きされる可能性がある。
- 異なるデータを渡す場合はリクエストコードを変えるべき
- フラッグ(flag):
- PendingIntentの振る舞いの指定(上書き、更新、付加など)にフラグを使用します。
- FLAG_CANCEL_CURRENT:同等のPendingIntentオブジェクトがシステム内に存在する場合は、既存のものを取り消してから、新しいものを作成します。
- FLAG_UPDATE_CURRENT: システム内にこのPendingIntentと同じPendingIntentオブジェクトがすでに存在する場合に、既存のデータを更新します。
- FLAG_ONE_SHOT:PendingIntentが1回しか使用できず、使用後は自動的に取り消されることを示します。
- FLAG_NO_CREATE: 指定のPendingIntentと同じPendingIntentがシステム内部に存在しない場合、新規に作成せず、nullを返します。
- FLAG_IMMUTABLE: PendingIntentオブジェクトが変更不可能であることを示します。
FLAG_CANCEL_CURRENT または FLAG_UPDATE_CURRENT フラグを同じ requestCode と一緒に使用する場合、これらは実際には互いにオーバーライドされ、最後のフラグだけが機能することに注意してください。
このコード例に示されている。
Intent intent = new Intent(context, MyReceiver.class);
intent.putExtra("data", "Hello World");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, flag);
PendingIntentは、アクティビティの起動、サービスの起動、ブロードキャストの送信にも利用できます。上記の例は、MyReceiverを対応するコンポーネントに置き換えることができます。