2011/08/07

[widget]intent-filter

過去記事:2010/08/21 11:54
intent-filterのマッチングについては、「他もアクティビティ図にしたので、見たい人は持っていってくだされ。」ということにした。
これは複雑だ!
しかし、Uriだけのマッチングはもう少しシンプルで、hostやportの一致を見ている。
つまり、こう言えよう。
intent-filterの比較は、intent-filterごとに行われる、と。
今回でいえば、
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="jp.typepad.hirokumaEjectSD.WIDGET_CONTROL"/>
</intent-filter>

と、
<intent-filter>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<action android:name="android.intent.action.MEDIA_EJECT"/>
<action android:name="android.intent.action.MEDIA_REMOVED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTABLE"/>
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<data android:scheme="file" />
</intent-filter>

だ。
前者はactionのみのため、match()はどれかのactionと一致し(matchAction)、dataはないのでMATCH_CATEGORY_EMPTY+MATCH_ADJUSTMENT_NORMALとなり(matchData)、categoryもないのでmatchData()の結果がそのまま戻り値となる。
MATCH_ADJUSTMENT_MASK でANDとって非0だからマッチした、となるのかな。
後者はactionとschemeがあるので、まずactionがどれかと一致し(matchAction)、schemeがあるのでどれかと一致してMATCH_CATEGORY_SCHEMEとなり(matchData)、categoryはないのでmatchData()の結果がそのまま戻り値となる。
これは MATCH_CATEGORY_MASK でANDするのか?
match()の戻り値をどう使うか、よくわからん。
が、そこはいいとしよう。
intent-filterの分け方としては、
  • actionのみのintentを受け付けるのであれば、同じintent-filterにまとめてよい
  • actionとschemeがあるintentを受け付けるのであれば、同じintent-filgerにまとめてよい
  • categoryを含む場合は完全一致となるので注意すべし
ということになるだろうか。
試していないので、そうなるかわからんが、そうなるんではないかね。

MOUNT/UNMOUNTなどのintentは、schemeとして"file"が付加されている。
送信されるintentはこんな感じだ。
in = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + path));
むむ、ということは、schemeだけでなくpathもあることになる。
しかしご安心を。
matchData()でpathが比較されるのは、addDataAuthority()した場合のみだ。
XMLだと、<auth>タグがそれに該当するはずなのだが・・・ドキュメントにはないな。
ちなみに、IntentFilterクラスには、writeToXml()というメソッドがある。
試してないけど、どうやらXMLに吐きだしてくれるみたいだ。
何か使えるかな?

なお、MOUNT/UNMOUNTを受け付けるには許可が必要となる。
AndroidManifest.xmlに、
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
がいるのだ。
まあ、忘れていてもlogcatで例外を投げてくれるので、わかりやすいがね。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。