2

基本的にアプリ内の機能へのクイックリンクであるウィジェットがいくつかあります。

これらのウィジェットは基本的に ListView/GridViews であり、メイン アプリの実行中に変更されるデータによってサポートされます。

データはアプリの実行中にのみ変更されるため、更新頻度は次のように設定されます。

android:updatePeriodMillis="0"

データが変更されたときに、次のコマンドを実行します。

public void updateWidget(@SuppressWarnings("rawtypes") Class provider) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
    int[] gridids = appWidgetManager.getAppWidgetIds(new ComponentName(this.getPackageName(), provider.getName()));

    Intent intent = new Intent(this, provider);
    intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,gridids);
    sendBroadcast(intent);
}

プロバイダーの でこれをキャッチし、onReceive()その呼び出しから更新メカニズムを取得できます。

public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    Log.e(this.getClass().getSimpleName(), "onReceive()");
    int[] ids = intent.getExtras().getIntArray("appWidgetIds");
    for(int id : ids) onUpdateWithService(context, id);
}

protected void onUpdateWithService(Context context, int widgetId) {     
    super.onUpdateWithService(context, widgetId);
    RemoteViews views = new RemoteViews(context.getPackageName(), getResourceLayout(context, widgetId));                    

    Intent intent = new Intent(context, GridViewWidgetServiceAdapter.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));

    views.setRemoteAdapter(R.id.listView, intent);
    views.setPendingIntentTemplate(R.id.listView, PendingIntent.getActivity(context, -1, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT));
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    appWidgetManager.updateAppWidget(widgetId, views);
}

私が抱えている問題は、コードが起動しupdateAppWidget()て呼び出されても、ウィジェットの UI が変わらないことです。

ウィジェットの更新に関するトリックがありませんか?

4

1 に答える 1

3

この答えは問題を解決するようです。

なぜ問題が解決するのかはわかりませんが、そうです...

インテントに次の行を追加すると正常に動作します

Intent intent = new Intent(context, GridViewWidgetServiceAdapter.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
intent.putExtra("Random", Math.random() * 1000); // Add a random integer to stop the Intent being ignored.
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
于 2013-08-12T10:14:11.397 に答える