AppWidgetManager.updateAppWidgetの注意

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つあったときだけだめなのか、原因を調べてみないといけませんね・・・
何かポカをしていたら教えてください。

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(16区分17回 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、Ruby Programmer Gold、AWSソリューションアーキテクト(アソシエイト)、日商簿記2級、漢検準1級などを保有。

babaの書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ