任意のActivityのショートカットを作成する
というものを作ってみました。
ソースコードもありますけど、コメントほとんど書いてない上に汚いです。
こんな感じです。
- アプリケーション中の特定の
Activity
の機能だけをピンポイントに起動したい - アプリケーション中の特定の
Activity
のショートカットをホームに生成したい - ショートカットの名前やアイコンを自由に変えたい(未実装)
途中でモチベーションが尽きなければ最後まで実装すると思います。
Activityのセキュリティ
作ってみて意外なのは、思った以上にexported=true
のActivityが多いこと。
しかもその大半は、起動に必要なBundle
のパラメータを渡せないためNullPointer
で落ちる、というアレな作りでした。はてなブックマークのAndroidアプリがとても分かりやすい。
なぜそうなるかというと、AndroidManifest
でActivity
にIntentFilter
を設定すると、 そのActivity
は外部に公開する意思がある ものとみなされて、exported=true
が設定されるからです。
必要がない限りIntentFilter
は設定するべきではないし、もし内部利用が目的のActivity
にIntentFilter
を設定する必要がある場合、明示的にexported=false
を設定しなければなりません。
exported=false
にさえしておけば、CONTEXT_IGNORE_SECURITY
でContext
を取得されても、外部から起動することはできません。
おそらくURLから起動したいというようなケースでActivity
にIntentFilter
を設定しているのだと思うのだけど、URL経由の起動はBroadcastReceiver
にまとめて、そこで入力値をサニタイズすればいいんじゃ?とか思う。
作ったことはないので、実現できるのかは知らないけど(今度作ってみよう)。
UPDATE: BroadcastReceiver
ではandroid.intent.category.BROWSABLE
をハンドリングできないようです。あくまでブロードキャストを受信するだけなので、Activity
とはインテント解決の仕組みそのものが違うみたいです。
そのほか
Activity
が乱雑なアプリは出来があまりよろしくないという印象。Activity
に何かの役割を持たせるという作り方をすると、同じような機能を持つActivity
が量産されていくんだろうなぁと遠い目。
逆に凄いと思ったのがニコニコ動画のアプリで、公開Activity
が2つ、他は設定などで非公開となっているものが3つだけだった。Android版はあまり使い込んでないけど、内部の複雑な画面遷移のほとんどをFragment
で制御してるんじゃないかな?ピーキーすぎてやばい。(HTML5で作ってるという可能性もあるけど、それにしては動きがサクサクしてるので違うと思う)
でもまあそういうのはユーザーは興味ないので、★1が付きまくるんだろうなぁ。