ちょっと備忘まで、ということで控えを。
とりあえず AndroidManifest から。widget 用に以下なカンジの記述が必要。
{% gist b0c4622cf4eced0d54e7 %}
intent-filter は固定。あと、meta-data の所で appwidget-provider な要素を持ってる xml resource を指定します。この例だと res/xml/appwidget.xml になります。
{% gist 4fb136b1b625d3e96191 %}
- 幅、高さ
- layout resource
- 更新間隔
- 一覧に表示するアイコン
などを指定するのかどうか。レイアウトは略します。で、AppWidgetProvider を継承するこの例で言うと WidgetProvider というクラスですが callback としては
- onEnabled は最初の AppWidget が追加されるときに呼びだされる
- onUpdate は AppWidget が追加されるとき、または更新間隔ごとに呼びだされる
- onDeleted は AppWidget が削除されるときに呼びだされる
- onDiabled は最後の AppWidget が削除されるときに呼びだされる
とのこと。今日見た実装では onUpdate で Service を起動して onDeleted で Service を停止する形にしていましたが、BroadcastReceiver の方が良さげですね。Service だと動きつづける保証が無いだけに。
で、起動される Service の onStart において、まずは RemoteViews の instance を生成します。
{% gist 1e252fc0f61b80678723 %}
次に、イベントハンドラを登録するのですが基本的な手順としては
- Intent のオブジェクトを作って
- 何のための Intent なのかを識別するための action を設定して
- PendingIntent なオブジェクトを作って
- RemoteViews オブジェクトの例えば setOnClickPendingIntent みたいなメソドでハンドラを設定して
- アプデイト
みたいな流れなようです。また、今回見た例では Service だったので PendingIntent.getServce メソドを使っていたのですが、BroadcastIntent を発行する場合には PendingIntent.getBroadcast メソドを使う必要があるようです。
でもこれってどうやって Service の識別をしてるのかが謎だな。あ、Manifest で Service に intent-filter な属性を設定してますね。成程。
{% gist 029b0243051dc5d78e5a %}
なので設定されたハンドラが起動される毎にこの例だと onStart しているようです。という事は別に Service でも良いのかな。また、今回見てる例だと上の箇条書きのハンドラを設定している後に action で何のための Intent かを見てそれに沿った処理を書いているようです。
最後に以下なカンジで更新処理というか登録処理を書いてあげています。
{% gist 8be4fdf8746bb15ffa4f %}
参考ポインタを以下に列挙しておきます。