暗黙的インテントと「デフォルトでの起動」の関係

ブラウザやホームランチャーアプリには、「デフォルトでの起動」なるものがある。
各暗黙的インテントの条件が同じものがあれば、それらをまとめるて、その中から「デフォルト」な受け取り元を設定して記憶しておくことができる。
最近、ブラウザ内リンクからの公式Twitterや非公式Facebook対応アプリの起動をよく見かけるが、それぞれ対応しているアプリと並んでブラウザがそれぞれ暗黙的インテントから該当選択肢として表示されるが、ブラウザアプリ設定画面からのデフォルトの設定は、通常起動のブラウザ向け暗黙的インテントの「デフォルト設定」のみ。

渡してるデータ

ブラウザからそれぞれのリンクを叩く。

I/ActivityManager( 195): START {act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=http://twitter.com/ cmp=android/com.android.internal.app.ResolverActivity (has extras)} from pid 30602

I/ActivityManager( 195): START {act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=http://www.facebook.com/unagi cmp=android/com.android.internal.app.ResolverActivity (has extras)} from pid 30602

差は渡してるデータであるURL文字列。
連続でそれぞれを「デフォルト」に設定すると後が有効となるので、アプリ「ブラウザ」が選択なしのデフォルトで受け取れる暗黙的インテントは1つ。URL文字列データを含んで記憶している。

いろいろな暗黙的インテントの起動のされ方

ログレベルでまとめておく。

音楽

.mp3のローカルファイル名

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=file:///fake.mp3 typ=audio/* cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

音楽ストリーミング

.mp3のURL(http://)

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=http:fake.mp3 typ=audio/* cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

ブラウザ

URL(http://)

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=http://www.appiator.com cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

カメラ

I/ActivityManager( 195): START {act=android.media.action.IMAGE_CAPTURE cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

メール

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=mailto: cmp=android/com.android.internal.app.ResolverActivity (has extras)} from pid 2906

画像

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=file:///icon.jpg typ=image/* cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

PDF

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=file:///fake.pdf typ=application/pdf cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

ダイアラー

I/ActivityManager( 195): START {act=android.intent.action.CALL_BUTTON cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

動画

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=file:///fake.mp4 typ=video/* cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

動画ストリーミング

I/ActivityManager( 195): START {act=android.intent.action.VIEW dat=http:fake.mp4 typ=video/* cmp=android/com.android.internal.app.ResolverActivity} from pid 2906

その他

TwitterFacebookの場合を含め、ブラウザ、カレンダー、ホーム、カードック、デスクドック、電子書籍(EPUB)、SMSなどアクション種別とそれに付加するデータ文字列でかなりの種類がある。
受け取るアプリの実装にすべては依存するはず。

まとめ

結局は、各アプリの「デフォルトでの起動」という設定は、同じインテント受け取り形式をもつアプリが存在したときに、デフォルト設定されたアプリに紐付いてひとつだけ記憶される。
かなりの数になるはずなのだが、OSの機能としてストレスなくどこまで対応できるのか。