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
が複数必要なのか、
自分の胸に手を当てて確認して欲しい。