2011年1月24日月曜日

ウィジェットの話

アンドロイドアプリで、ウィジェットの作り方って結構検索引っかかりますが、
恐らく作ってみて一番難しいと思われるところがあまり書かれていないので
書いておこうと思います。


ウィジェットは難しい


これは間違いない事実です。

何故か?


実際の設計者に聞いてみないと真実は解りませんが、自分は工夫を重ねた
結果なんじゃないかと思っています。

ウィジェットという常駐アプリが沢山動いても出来るだけ電池やメモリを
消費しないようによく考えられてるなと思うのです。

お陰さまでなんだか分かりにくい、作り手にとっては難しい、使い手にとっては
不安定な可能性のあるAPIになってしまったのかなと。


基本的に android は java ですので、開発はオブジェクト指向になります。

画面作成の基本である activity はそういう観点からだととても解りやすいですね。


でもウィジェットはいつもロードされている必要があるので、アプリケーションの持つ
全ての機能をロードしているわけにはいかないんです。メモリもったいないんで。


その為、以下の様な構造になっています。

・「画面にこういうウィジェットを表示しなさい」という命令がAPIにあり、それで描画する。
・画面要素の動作に、「仕込まれたインテント(PendingIntent)」を定義できる。
・もしくは時間間隔で発行される PendingIntent を準備する。
・【重要】PendingIntent の受け取りはウィジェットのクラス=マニフェスト定義で受け取る
・だから自分が作ったウィジェットの全てのインスタンスは同じウィジェットインスタンスが受け取る
・OnReceiveで受け取り、サービスなどを使って、PendingIntent を受け取り実行する。


…はい、全然わかりませんね。

解りやすく一言で言うと、ウィジェットのインスタンスはシングルトンなんです。
下手にスタティックじゃないので解りずらいんです。

なんでこうなっているのかというと、それは Zygote というプロセスの親玉が
マニフェストからインテントフィルターを判断してインスタンスを生成する、という
androidの基本構造があるためなんですが、たいていの人はどうでもいいですね。

とにかく解ってしまえば話は簡単で、いつもウィジェットID配列を気にしてループ処理
を入れておけばオーケー(時間間隔実行の場合は例外時とか大変ですが)。貼られている
ウィジェットごとにインスタンスが出来ないんだという事を常に意識しておきましょう。


余り書かれていないウィジェットに関するお話でした。どうでしたか?
同じ(クラスの)ウィジェットをいっぱい貼り付けられる事を考えて作りましょうねー☆


…ん?まさか悩んだの俺だけ!?

0 件のコメント:

コメントを投稿