My Photo

« FF11 ローグプーレーヌをゲット | Main | Xperia rayにb-mobile Fair導入 »

November 08, 2011

Androidアプリ開発メモ035:AppWidget その2

AppWidgetについての前記事:Androidアプリ開発メモ034:AppWidget

AppWidgetホスト

AppWidgetを保持できるコンポーネントをAppWidgetホストという。
普通はホームスクリーンだが、AppWidgetHostを使えば普通のアプリもApp Widget hostになれるようだ。

サービスの利用

リファレンスでは、AppWidgetの実装にサービスを利用することも検討するようにと書かれている。
理由は、AppWidgetProviderがブロードキャストレシーバなので、そのプロセスがずっと残るとは限らないから。
#AppWidget更新のブロードキャストインテントが投げられると、AppWidgetのブロードキャストレシーバをシステムが自動的に起動してくれる、とはなってないのか?
ApiDemosのExampleAppwidgetProviderはサービスを使ってないようだが、onUpdate()でサービスを起動する実装が例として挙げられている。

ここから、開発ガイドのサンプルコードに出てくるクラス・メソッドについて。

RemoteViews

AppWidgetは、AppWidgetProviderまたはAppWidgetProviderから起動したサービスとは異なるプロセスで動いている。異なるプロセス上のAppWidgetのビューを扱うにははRemoteViewsを使う。
"RemoteViews"と複数形になっているので、1個のビューではなく、レイアウトを含めたひとまとまりのビューの集合を扱うクラスなんだろう。
リファレンスのClass Overviewには以下のように書いてある。

そのクラスは、別のプロセスに表示できるビューの階層(hierarchy)を説明します(describe)。階層は、レイアウトのリソースファイルから膨らませ、そしてこのクラスでは、膨張した階層の内容を変更するためのいくつかの基本的な操作を提供しています。

レイアウトファイルに定義されている1つの画面のビューの集まりは階層構造しているから。hierarchyとはそのビューの集まりのことか。

android.widget.RemoteViewsクラス
public RemoteViews(String packageName, int layoutId)
指定したレイアウトファイルに含まれるビューを表示する新しいRemoteViewsオブジェクトを生成する。

public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
クリック時にIntentを発行するように指定する。
提供されたPendingIntentを起動するsetOnClickListener(android.view.View.OnClickListener)を呼び出すことに相当する。コレクション内の項目(例えばListView、StackViewなど)のオンクリックアクションを設定する場合は、このメソッドは動作しない。代わりに、setPendingIntentTemplate(int, PendingIntent)をsetOnClickFillInIntent(int, Intent)とあわせて使用する。

PendingIntent

PendingIntentを使うとタイミングを指定して(イベント発生時など)Intentを発行できる。Intentとターゲットアクション(startActivity()など)を組み合わせたラッパーとみなすことが出来る。
このクラスのインスタンスはgetActivity()、getBroadcast()、getService()で生成する。

android.app.PendingIntentクラス
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags)
Context.startActivity()の呼び出しのように、新しいアクティビティを開始するPendingIntentを取得する。アクティビティは、既存のアクティビティのコンテキストの外部で起動されるので、IntentでIntent.FLAG_ACTIVITY_NEW_TASK起動フラグを使用する必要があることに注意する必要がある。

public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)
Context.sendBroadcas()の呼び出しのように、ブロードキャストを実行するPendingIntentを取得する。

public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags)
Context.startService()の呼び出しのように、サービスを開始するPendingIntentを取得する。

上記3個のメソッド第2引数requestCodeについて、リファレンスでは "currently not used" と書いてあるが、使用されているらしい。詳しくは参考サイト3を参照。

AppWidgetManager

AppWidgetの更新はAppWidgetManager#updateAppWdiget()を使う。

android.appwidget.AppWidgetManagerクラス
public static AppWidgetManager getInstance(Context context)
AppWidgetManagerのインスタンスを取得する。

public void updateAppWidget(ComponentName provider, RemoteViews views)
指定されたproviderのAppWidgetすべての画面を更新する。
引数:
  provider  AppWidgetのプロバイダのためのComponentName
  views  表示するRemoteViews

public void updateAppWidget(int[] appWidgetIds, RemoteViews views)
appWidgetIdsのAppWidgetの画面を更新する。

ComponentName

AppWidgetManager#updateAppWidget()の引数に使われているComponentNameは、利用可能な特定のアプリケーションコンポーネント(Activity,Service,BroadcastReceiver,ContentProvider) の識別子である。コンポーネントを識別する情報としてパッケージ名とパッケージ内のクラス名(ともに文字列)がカプセル化されている。

android.content.ComponentNameクラス
public ComponentName(String pkg, String cls)
新しいコンポーネント識別子を生成する。

参考サイト:
1.Android適当メモ : RemoteViewsの仕組み
2.Y.A.M の 雑記帳: Android AppWidget
3.Y.A.M の 雑記帳: Android AppWidget の PendingIntent で putExtra するときの注意
4.AppWidgetの作成(2) + PendingIntent << Tech Booster

« FF11 ローグプーレーヌをゲット | Main | Xperia rayにb-mobile Fair導入 »

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

Comments

Post a comment

(Not displayed with comment.)

TrackBack

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

Listed below are links to weblogs that reference Androidアプリ開発メモ035:AppWidget その2:

« FF11 ローグプーレーヌをゲット | Main | Xperia rayにb-mobile Fair導入 »

May 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 31      
無料ブログはココログ

日本blog村

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

好きな音楽家

メモ

XI-Prof