Tech Racho エンジニアの「?」を「!」に。
  • 開発

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。