My Photo

« FF11 スラッグNMに2連敗 | Main | へこむ1日だった »

November 02, 2011

Androidアプリ開発メモ034:AppWidget

AppWidgetとは

AppWidgetはホームスクリーンに貼り付けられて常駐する小さいアプリケーション。フルスクリーン表示はできないらしい。

必要なのは以下。

  • レイアウトファイル
  • 設定ファイル
  • AppWidgetProviderを継承したクラス
  • AndroidManifest.xmlへAppWidgetの宣言を書く。

レイアウトファイルは使用できるレイアウトが以下のFrameLayout,LinearLayout,RelativeLayoutの3つのみで、使用できるウィジェットも限定されるが、それ以外は通常のアプリケーションと同じ。

設定ファイル

res/xmlフォルダにappwidget-provider要素1個だけがあるXMLファイルを作る。その属性で設定をする。

android:minHeight,android:minWidthはAppWidgetのサイズを指定する。サイズは決められたセル単位となる。
値は使うセルの数で下記の計算をしてdp(dip)単位で指定する。

  (セルの数 * 74) - 2

android:updatePeriodMillisは更新間隔をミリ秒単位で指定する。0とした場合は自動更新しない。
最小値は1800000(30分)で、それ以下の場合を設定した場合は1800000に繰り上げられる。

android:initialLayoutはレイアウトファイルを指定する。レイアウトファイルが"res/layout/appwidget.xml"の場合は、"@layout/appwidget"と指定する。

android:configureはAppWidget設定用アクティビティのクラス名を指定する。これはオプション。

<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/appwidget"
    android:minHeight="72dp"
    android:minWidth="146dp"
    android:updatePeriodMillis="0"
    android:configure="com.example.appwidgetexample.AppWidgetExampleConfigure" >
</appwidget-provider>

AppWidgetProvider

android.appwidget.AppWidgetProviderクラスを継承し、以下のメソッドを必要に応じてオーバーライドしてブロードキャストレシーバを作成する。

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
AppWidget更新時に呼ばれる。

public void onDeleted(Context context, int[] appWidgetIds)
AppWidget削除されると毎回呼ばれる。

public void onEnabled(Context context)
AppWidgetのインスタンスが始めて作成されたときに呼ばれる。

public void onDisabled(Context context)
AppWidgetがすべて削除されたときに呼ばれる。


AVDで同じAppWidgetを2個ホームスクリーンに貼り付けた場合、貼り付けるときにはそれぞれ1回ずつonUpdate()が呼ばれてそのときのappWidgetIds.lengthは1だが、自動更新(updatePeriodMillis)の時にonUpdate()が1回だけ呼ばれてappWidgetIds=2である。しかし、AppWidgetを1個削除しても次のouUpdate()の呼び出しでappWidgetIds=2である。なんか変な感じがする。

上記のメソッド全部をオーバーライドする必要はなく、例えば表示が変わるだけでリソースの取得・解放が必要なければonUpdate()だけオーバーライドすればよい。

AppWidgetProvider#onReceive()の実装は、ブロードキャストをフィルタし上記のメソッドを適切に呼び出している(ACTION_APPWIDGET_UPDATEのIntentを受信した場合にonUpdate()を呼ぶ、など)ので、通常はこのメソッドをオーバーライドする必要はない。

以下、リファレンスのClass Overviewの訳(一部)
public class AppWidgetProvider extends BroadcastReceiver
クラスの概観
AppWidgetプロバイダの実装を補助する便利なクラス。AppWidgetProviderでできるすべてのものは、いつものBroadcastReceiverでできる。AppWidgetProviderは単に、onReceive(Context,Intent)で受信されたIntentからの関連するフィールドをパースし、受信した追加のものとともにフックメソッドを呼ぶだけである。

AppWidgetの宣言

AndroidManifest.xmlにAppWidgetの宣言を追記する。
<receiver
  android:name=".AppWidgetExample"
  android:label="@string/app_name">
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  </intent-filter>
  <meta-data
    android:name="android.appwidget.provider"
    android:resource="@xml/appwidget_provider_info" />
</receiver>

intent-filter要素ではactionがAPPWIDGET_UPDATEのブロードキャストインテントを受信できるようにしている。必要に応じて他のブロードキャストインテントも受信できるようにする。

meta-data要素のandroid:name属性はメタデータの名前を指定する。AppWidgetの設定の場合は"android.appwidget.provider"とする。

android:resource属性の値はAppWidgetの設定ファイルのファイル名(この場合は"appwidget_provider_info.xml")を指定する。

参考:
f. アプリウィジェット - ソフトウェア技術ドキュメントを勝手に翻訳
AppWidgetの作成(1) << Tech Booster
ウィジェットの作り方 | テックファーム
Y.A.M の 雑記帳: Android AppWidget
Android適当メモ : RemoteViewsの仕組み
Android1.6ではandroid:updatePeriodMillisの最小値は1800000: 雪羽の発火後忘失

« FF11 スラッグNMに2連敗 | Main | へこむ1日だった »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53143818

Listed below are links to weblogs that reference Androidアプリ開発メモ034:AppWidget:

« FF11 スラッグNMに2連敗 | Main | へこむ1日だった »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof