AppWidgetについての前記事:Androidアプリ開発メモ034:AppWidget
AppWidgetホスト
AppWidgetを保持できるコンポーネントをAppWidgetホストという。
普通はホームスクリーンだが、AppWidgetHostを使えば普通のアプリもApp Widget hostになれるようだ。
サービスの利用
リファレンスでは、AppWidgetの実装にサービスを利用することも検討するようにと書かれている。
理由は、AppWidgetProviderがブロードキャストレシーバなので、そのプロセスがずっと残るとは限らないから。
#AppWidget更新のブロードキャストインテントが投げられると、AppWidgetのブロードキャストレシーバをシステムが自動的に起動してくれる、とはなってないのか?
ApiDemosのExampleAppwidgetProviderはサービスを使ってないようだが、onUpdate()でサービスを起動する実装が例として挙げられている。
ここから、開発ガイドのサンプルコードに出てくるクラス・メソッドについて。
ここで、 genはなかった。
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
0 件のコメント:
コメントを投稿