複数配置させるandroidウィジェット作成時の注意覚え書き

先日のATMウィジェットを作成する際に、先日の記事で書いたようにデータ受け渡しでかなり詰まったのですが、それ以外にも各ウィジェット毎に独立で処理を行わせようとすると、これはこれで若干詰まったのでこちらも覚書程度に記載します。

Androidの普通のアプリケーションとして作成する分には、同一アプリが複数起動することはまずないので、考える必要はないのですが、ウィジェットの場合、同一のアプリを複数配置、さらにそれぞれ表示させる内容が違うという可能性が起こりうるので、それを実際に動作させるためにはonUpdate時にそれぞれのWidgetidに対して処理を行うようにします。

以下のコードは、前回ATMウィジェットでウィジェット上に表示される文字列に関して、Onupdate内でその処理を行った際のものです。

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
	for (int appWidgetId: appWidgetIds) {		
			RemoteViews rv = new RemoteViews(context.getPackageName(),
					R.layout.main);
			rv.setTextViewText(R.id.textview1, "変更テキスト");
			appWidgetManager.updateAppWidget(appWidgetId, rv);			 
			 }
}

実際には、次回更新時のアラート設定等も行っていますが、今回その部分は省略しています。

onUpdate時の引数として渡されているappWidgetIdsは現在起動中のこのウィジェットのウィジェットIDの配列です。
したがって、この配列のID全てに対して処理を行うことで、表示中のウィジェット全てに処理が行うことが出来ます。

今回はウィジェット上の表示文の変更を行うため、RemoteViewsを利用して処理しています。
その際に、上記のようにappWidgetManagerにappWidgetIdを渡して表示の更新を行うことによって、そのIDのウィジェットに対してだけ処理を行うことが出来ます。したがってforeach文で全てのIDに対して更新処理を行っていくことによって、ウィジェット毎に個別に処理を行うことが出来ます。

通常のアプリの場合は、特にこのあたりは考えずに作成が可能なので、若干情報を見つけるのに手間取りましたが、以下のサイトさん等を参考にしながら、作成することで何とかなりました。

また、同様にPendingIntentをそれぞれのウィジェットに対応させて送信する場合には、こちらのサイトさんを参考にした所、PendingIntent.getBroadcastの第2引数にウィジェットIDを渡せばokとのこと

ウィジェット関係は、普通のアプリ全般と比べると情報があまり多くない(ウィジェット∈アプリなので当然と言えば当然ですが)うえ、挙動も特殊な部分があり、若干やりずらい所はありますが、前回と今回のでなんとか今回のアプリに関しては詰まっていた部分も進めることができたので、早いうちにATMウィジェットの汎用性をどんどん上げていきたいと思います。

また、開発中につまったら覚書が増えますが…

参考リンク

http://16c.jp/2011/04/30/send_pendingintent_for_multi_widget/

http://japan.internet.com/column/developer/20091030/26.html

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>