[widget]AppWidgetManagerのgetAppWidgetIds(ComponentName)が返すIDについて

540 views
Skip to first unread message

yoshiyuki kanno

unread,
Jun 28, 2011, 10:06:13 AM6/28/11
to android-group-japan-ml
表題の件についての質問になります。

複数widgetのインスタンスを生成した際に、表題のメソッドで
widgetのid群を取得することができますが、
configureアクティビティを設定した場合、設定画面で「back」ボタンをおしてwidgetの生成をキャンセルした場合に、
キャンセル時に採番されたidも返ってきてしまうようです。

このゴミを削除する(もしくはゴミができない)方法を探してみたのですが、そのようなI/Fはないようで、
現状は以下のようなトリッキーな方法で回避しています。

ConfigureなActivityでonKeyDownをオーバーライドして、キャンセル時に採番したIDをsharedPreferenceに保存しておき
widget群へのupdateを行う際に、キャンセルされたidは無視するような実装にすることで、不要な処理が走らないようにしています。
以下にソースがあります。

この問題への根本対応をご存知の方がいらっしゃいましたら、ご教授頂ければと思います。

※あとconfigureを設定するとonUpdateはコールバックされないとドキュメントにはありますが、実際には呼ばれているのも気になっています。
 これを無視する必要がある?

以上、よろしくお願いします。

yoshiyuki kanno

unread,
Jun 29, 2011, 6:13:54 AM6/29/11
to android-group-japan-ml
自己解決したので、以下に示します。

■ver2.x以降のランチャの場合

「onActivityResult」で

int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
if (appWidgetId != -1) {
mAppWidgetHost.deleteAppWidgetId(appWidgetId);
}

な処理を行っているので、intentからappWidgetIdが正しく取得できた場合は、
configureなactivityの「onCreate」で

Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_CANCELED, resultValue);

とすればゴミはできません。

■ver1.x系のランチャの場合
上記のような処理に対応していないため、ゴミIDができます。
そのため、やはり最初に投稿したような形でアプリ側でゴミIDを管理する必要がありそうです。

以上、参考になれば幸いです。

2011年6月28日23:06 yoshiyuki kanno <neko...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages