2012-02-27

AndroidのIntent-Filterについてまとめてみる

自分でつくった複数のアプリ間の連携を行うために、AndroidのIntentについてまとめてみる。自分用のメモなので他の人には読みづらいかも。

Intent Filterは、Actionテスト、Categoryテスト、Dataテストの3種類がある。Intentが投げられた場合、この3つのテストを通過したActivityだけが起動の対象となる。

1.Actionテスト

manifest側のintent-filterには複数指定できるが、Intentオブジェクトには一つしか指定できない。
Intentオブジェクトで指定されたactionが、intent-filterに含まれていれば受け取れる。
(intent-filterにactionが指定されていないと、Intentを絶対に受け取れない。)


2.Categoryテスト

intent-filterにもIntentオブジェクトにも複数指定できる。
Intentオブジェクトに指定されたすべてのCategoryが、intent-filterに指定されていれば受け取れる。(intent-filter側にもっとたくさんのCategoryがふくまれていてもよい。)
IntentオブジェクトにCategoryを指定しないこともできるが、Activityが明示的に指定されない暗黙的Intentの場合は、intent-filterにandroid.intent.category.DEFAULTが含まれていなければ、テストをパスしない。


3.Dataテスト

intent-filterは、mimeType、shema、host、port、path、authority(hostとportをまとめてもの)といった要素を持つ。IntentオブジェクトにはUriやDataTypeを指定する。
テストは複雑なので詳細に調べていない。


ということで、Dataテストについては、ちゃんと調べていない。しかし、DataテストはデータをUriで渡す場合に、そのデータをちゃんと処理できるかどうかでフィルタリングするというのが意図なので、Uriでデータを渡さない場合は考慮しなくてよさそう。

起動されるアプリをフィルタリングしたい場合は、Categoryテストを用いるのが正しいだろう。
たとえば、ACTION_VIEWを渡しただけでは、実にさまざまなアプリが起動の候補になってしまう。これを絞り込むには、Categoryを追加してやれば良い。