2012年11月19日月曜日

[Android] ショートカットの選択、作成、保存の流れをLauncherのソースコードから追ってみる

メモ書きなので荒れてます。

Android 3.0以降のLauncherだとなーんとなく複雑そうなので
Android 2.3.7のLauncherのソースコードを見てみる。


ダイアログでショートカットの作成を選んだら・・・


ショートカットの種類一覧を表示するIntentを発行する。

・pickIntent.putExtras(bundle)で何やらデータを付け足している。
・どうやらショートカット一覧に"R.string.group_application"(中身は"アプリケーション"とか"Applications"のローカライズされた文字列)を独自に追加したいみたい。
・"ACTION_CREATE_SHORTCUT"なIntentにBundleを与えると項目が増える、っていう事を記述した資料はまだ見つけていない。
・つけたした"Applications"の項目については詳細を後述→processShortcutへ


一覧からショートカットの種類を選択すると、ショートカット作成画面へのIntentがonActivityResultに戻ってくる



受け取ったIntentをそのまま再度発行すれば、各アプリケーションが持つショートカット作成画面が開く

・条件分岐しているのは、pickShortcutで追加した項目を処理するため。
・pickShortcutで追加した項目を選択した際に、ショートカットではなくアプリケーションを追加する処理に切り替わる。
・しかし、この実装だと、"Applications"とかの名前をショートカット名につけた場合に、うまく処理してくれない気がする・・・
・独自に何か追加してないければ、ただ再度投げなおすだけでOK


各アプリケーションから返却されたショートカットを受け取る

・ショートカットが具体的にどういったデータを持つのかは別記事


受け取ったデータをショートカットとして登録する処理が始まる



受け取ったIntent内に含まれる、"Intent"、"名前"、"アイコン"の3つの要素を取り出しShortcutInfoというランチャー内の独自クラスに格納する作業が行われる

・Intent.EXTRA_SHORTCUT_ICONのデータを見て、Parcelable(実体はBitmap)がnullだったら、Intent.EXTRA_SHORTCUT_ICON_RESOURCEのデータをShortcutIconResourceとして使う実装
・万が一、両方データが含まれていたらBitmap優先でいいのかな?


上で作成したShortcutInfo内のデータをデータベースに登録する作業が始まる

・ShortcutInfoは、ここではスーパークラスであるItemInfoとして扱われているので注意。
・ContentValuesに格納したデータをContentResolverに渡す
・下記のBitmapデータはSQLiteDB内にBLOBとして書き込まれる


作成したShortcutInfo内のデータをContentValuesに格納する

・ContentValuesに格納されるデータは以下の通り
(1) タイトル (String)
(2) インテント (String) → intent.toUri(0)によってURI文字列にコンバートされている点に注意
(3) アイコンのタイプ (int) → アイコンがBitmapなのかShortcutIconResourceなのかを示す値が含まれる
(4) アイコンデータ (Bitmap) → アイコンタイプがShortcutIconResourceの場合には、リソースから取得したBitmapが格納される。Bitmapがnull でリソースからもBitmapが取得できなかった場合は格納されない。
(5) アイコンリソースのパッケージネーム (String) → アイコンのタイプがリソースの場合のみ格納される
(6) アイコンリソースのリソースネーム (String) → アイコンのタイプがリソースの場合のみ格納される


ContentValuesにBitmapを格納する際の処理

・Bitmapを圧縮してByte配列にして、データを格納している


格納先のSQLiteDBフォーマットは、ProviderのonCreateで確認できる。

0 件のコメント:

コメントを投稿