A description of an Intent and target action to perform with it.
android.app.PendingIntent
概要
他のアプリケーションが、あとから実行できるIntent。
Intentを他のアプリに渡す。
他のアプリケーション(VM)に、
あとで呼び出して欲しいIntentを作って渡す。
といってもIntentは自分のアプリ内に対する、明示的なものじゃないとダメな。
Intentの投げかたを指定する。
Intentを
- Context.startActivity()
- Context.startService()
- Context.sendBroadcast()
などに渡すとそのまま実行されるが、
- PendingIntent.getActivity()
- PendingIntent.getService()
- PendingIntent.getBroadcast()
に渡すとそれぞれの保留Intentを取得できる。
これを他のアプリケーションに渡してあげよう。
どうやって実現されてるの。
他のアプリ(VM)からIntent実行できるとかキモいよな。
しかもPendingIntentは親のアプリが死んでも使える。ヤバい。
果たしてその実体は!?という感じだけど、
PendingIntentはただのトークン。
トークンとデータを紐付けているのはAndroidのシステム。
つまり大元のシステム側にデータを保存してるだけ。
使いまわされろ。
もしも同じようなPendingIntentがget(getActivityとか)されたら、
使いまわされるような仕組みになっている。これ大事。
同じようなやつかどうかはIntent.filterEqualsによって判定されるんだけど、
これ、extraをみていない。
(action, data, type, class, categoriesが同じかどうかを判定している)
だからextraかえたPendingIntentを2つ作ると、実体は1つだけになる。
この使いまわしの方法はgetするときにflagで指定できる。
で使いまわされたくないなら、getするときのrequestCodeを別々の値にする。
つまり、この設計思想はアレに似てる。そう、
Context.startActivityForResult() だ。
他のActivityに対して返り値を1つだけ要求する。
他のアプリに対してIntentを1つだけ要求する。感じ。
まあそれだけだとアレだから、ってのでrequestCodeが用意してある。
requestCodeをアプリ内でユニークにしておけば、上書きされることは無い。
しかし果たしてほんとにぜったいにPendingIntentが複数必要なのか、
自分の胸に手を当てて確認して欲しい。