いろいろガンガンいこうぜ。体も大事に

普段はJavaでAndroidアプリ開発しているプログラマーのブログです。

Hello Widget! (2) AppWidgetProviderについて

Widgetを作る際に作ったAppWidgetProviderのサブクラス。
最小実装のWidgetを作った時は,メソッドを何も定義しないクラスを作りました。


AppWidgetProviderクラス。
BroadcastReceiverのサブクラス。


中でどんな複雑なことをしているのだろう?
と思いきや,ソースコード自体は以外とシンプルでした。

void onReceive(Context context,Intent intent)の中で,
飛んで来たIntentのActionに対応したメソッドを呼び出しているだけだでした。

  • ACTION_APPWIDGET_UPDATE
  • ACTION_APPWIDGET_DELETED
  • ACTION_APPWIDGET_ENABLED
  • ACTION_APPWIDGET_DISABLED
  • ACTION_APPWIDGET_OPTIONS_CHANGED

というそれぞれのActionに対して,

  • void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
  • void onDeleted(Context context, int[] appWidgetIds)
  • void onEnabled(Context context)
  • void onDisabled(Context context)
  • void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions)


というメソッドが,AppWidgetProviderのonReceiveメソッドの中で呼ばれていました。
appWidgetIdsなどの引数はIntentのExtrasから抽出していました。

ちなみに,AppWidgetProviderクラス自体のonUpdateメソッドなどは全く何もしていないメソッドでした。


アンドロイドデベロッパーのサイトによると,
そもそも,AppWidgetProviderクラスはアップウィジェットに関わるインテントのブロードキャストを扱うための便利クラスのようです。



それぞれのメソッドを自分なりにまとめてみました。


void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

このメソッドは,アップウィジェットを更新するために呼ばれる。
間隔は,AppWidgetProviderInfoの中のupdatePeriodMillisで指定した間隔で呼ばれる。
また,アップウィジェットウィジェットを初期化した時にも呼ばれる。
そのためもし必要であれば,ビューを扱うイベントハンドラーを定義したりするべき。
ウィジェットの設定Activityを使う場合は,
アップウィジェットを初期化した時このメソッドが呼ばれないことに注意しないといけない。


void onDeleted(Context context, int[] appWidgetIds)

アップウィジェットがアップウィジェットホストから消されるごとに呼ばれる。


void onEnabled(Context context)

初めてアップウィジェットインスタンスが生成されたときに呼ばれる。
二つ同じ種類のアップウィジェットを置いたとしても一回しか呼ばれない。
データベースを初期化生成したリだとか,
全てのアップウィジェットインスタンスに対して一回やればいいという処理はここ。


・void onDisabled(Context context)

アップウィジェットの最後のインスタンスがアップウィジェットホストから消される時呼ばれる。
一時的なデータベースの削除など,onEnabledメソッドでやったことに対しての後処理はここでやるべきらしい。


・void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions)

ウィジェットが初めて置かれた時と,サイズが変わったときに呼ばれる。
ウィジェットのサイズを取得できる。
(APIレベル16から)






ちなみに,

アップウィジェットを作成するために
AppWidgetProviderを継承せずに直接BroadCastReceiverを継承し,
それぞれのIntentのActionに応じた処理を記述して〜
という実装方法も可能らしいです。




それでは,また会えることを祈りつつ。