Androidのホームスクリーンウィジェットを更新するには、AppWidgetManager.updateAppWidget()
を使います。
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.provider);
remoteViews.setTextViewText(R.id.Text01, "hello");
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(new ComponentName(context, MyProvider.class), remoteViews);
これを連続で呼ぶときには、少し注意が必要です。
たとえば、ボタンのクリック操作にPendingIntentを割り当てるような処理は初期化時のみに行い、ウィジェットを使用中には表示の更新のみを行うような場合、以下のようにやりたくなると思います。
private void init(Context context) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.provider);
remoteViews.setTextViewText(R.id.Text01, "");
PendingIntent clickIntent = PendingIntent.getBroadcast(context, 0, new Intent("MYACTION"), 0);
remoteViews.setOnClickPendingIntent(R.id.Button01, clickIntent);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(new ComponentName(context, MyProvider.class), remoteViews);
}
private void update(Context context, String message) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.provider);
remoteViews.setTextViewText(R.id.Text01, message);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(new ComponentName(context, MyProvider.class), remoteViews);
}
このコードは基本的に動くのですが、initの直後にupdateを呼ぶと、以下の問題が発生することがあります。
「同じウィジェットを2つ以上設置したとき、2つめのウィジェットのボタンが反応しない」
init→updateの間にスリープを入れれば動きます。
どうやら、updateAppWidgetが完了しないうちに次の処理をして、ボタンへのpendingIntentの反映が失敗してしまうような動作です。
解決策としては、毎回ボタンの動作を設定する(updateを廃止してinitにmessageを渡せるようにする)か、initの後にスリープを入れるくらいしか、今のところ見つけていません。
なんで2つあったときだけだめなのか、原因を調べてみないといけませんね・・・
何かポカをしていたら教えてください。