6

データベースからの情報を表示するウィジェットがあります。ウィジェットは 1 時間ごとに定期的に更新されます。しかし、ウィジェットの更新ボタンをクリックして手動で更新することもできます.クリックアクションを実行してウィジェットを更新するにはどうすればよいですか?

注: ウィジェットはサービスを使用して操作を実行します。

事前にサンクス。

4

2 に答える 2

1

私は何時間も答えを探していましたが、ついにそれを理解しました。AppWidgetProvider の onUpdate で、ウィジェットをループし、ウィジェットごとにインテントを作成し (ウィジェット ID と、インテント URI のように一意にするためのデータを追加します)、PendingIntent を作成し、それをに割り当てます。クリック リスナーを作成するビュー。

    for(int i = 0; i<appWidgetIds.length; i++) {
        Intent serviceIntent = new Intent(context, MyService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendingServiceIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        views.setOnClickPendingIntent(R.id.refresh, pendingServiceIntent);

        context.startService(serviceIntent);
        appWidgetManager.updateAppWidget(appWidgetIds[i], views);
    }

私の特定のケースでは、更新用と設定アクティビティの開始用の 2 つのクリック リスナーがあったため、アクティビティを開始する場合は、PendingIntent.getActivity を使用して Intent.FLAG_ACTIVITY_NEW_TASK フラグを追加します。

2つの組み合わせ:

    for(int i = 0; i<appWidgetIds.length; i++) {
        Intent serviceIntent = new Intent(context, MyService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendingServiceIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent settingsIntent = new Intent(context, SettingsActivity.class);
        settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        settingsIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
        settingsIntent.setData(Uri.parse(settingsIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendingSettingsIntent = PendingIntent.getActivity(context, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        views.setOnClickPendingIntent(R.id.title, pendingSettingsIntent);
        views.setOnClickPendingIntent(R.id.refresh, pendingServiceIntent);

        context.startService(serviceIntent);
        appWidgetManager.updateAppWidget(appWidgetIds[i], views);
    }

これが誰かを助けることを願っています。:)

于 2013-10-09T08:54:42.827 に答える