2014年2月8日土曜日

PendingIntent

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