なるようになるかも

力は多くの場合、その人の思いを超えない。

任意のActivityのショートカットを作成する

というものを作ってみました。

glayash/Shortcut2 · GitHub

ソースコードもありますけど、コメントほとんど書いてない上に汚いです。

f:id:quesera2:20131125234352p:plain

こんな感じです。

  • アプリケーション中の特定のActivityの機能だけをピンポイントに起動したい
  • アプリケーション中の特定のActivityのショートカットをホームに生成したい
  • ショートカットの名前やアイコンを自由に変えたい(未実装)

途中でモチベーションが尽きなければ最後まで実装すると思います。

Activityのセキュリティ

作ってみて意外なのは、思った以上にexported=trueのActivityが多いこと。

しかもその大半は、起動に必要なBundleのパラメータを渡せないためNullPointerで落ちる、というアレな作りでした。はてなブックマークAndroidアプリがとても分かりやすい。

なぜそうなるかというと、AndroidManifestActivityIntentFilterを設定すると、 そのActivityは外部に公開する意思がある ものとみなされて、exported=trueが設定されるからです。

必要がない限りIntentFilterは設定するべきではないし、もし内部利用が目的のActivityIntentFilterを設定する必要がある場合、明示的にexported=falseを設定しなければなりません。

exported=falseにさえしておけば、CONTEXT_IGNORE_SECURITYContextを取得されても、外部から起動することはできません。

おそらくURLから起動したいというようなケースでActivityIntentFilterを設定しているのだと思うのだけど、URL経由の起動はBroadcastReceiverにまとめて、そこで入力値をサニタイズすればいいんじゃ?とか思う。

作ったことはないので、実現できるのかは知らないけど(今度作ってみよう)。

UPDATE: BroadcastReceiverではandroid.intent.category.BROWSABLEをハンドリングできないようです。あくまでブロードキャストを受信するだけなので、Activityとはインテント解決の仕組みそのものが違うみたいです。

そのほか

Activityが乱雑なアプリは出来があまりよろしくないという印象。Activityに何かの役割を持たせるという作り方をすると、同じような機能を持つActivityが量産されていくんだろうなぁと遠い目。

逆に凄いと思ったのがニコニコ動画のアプリで、公開Activityが2つ、他は設定などで非公開となっているものが3つだけだった。Android版はあまり使い込んでないけど、内部の複雑な画面遷移のほとんどをFragmentで制御してるんじゃないかな?ピーキーすぎてやばい。(HTML5で作ってるという可能性もあるけど、それにしては動きがサクサクしてるので違うと思う)

でもまあそういうのはユーザーは興味ないので、★1が付きまくるんだろうなぁ。