0

同じ AppWidget の新しいインスタンスをホーム画面に追加するたびに、のすべてのインスタンスの ID を使用して適切なAppWidgetProvideronUpdateメソッドが呼び出されることに気付きました。appWidgetIds

リファレンスには次のように明確に記載されています。

EXTRA_APPWIDGET_IDS 更新する appWidgetIds。これは、このプロバイダー用に作成されたすべての AppWidget である場合もあれば、サブセットのみである場合もあります。システムは、できるだけ少ない AppWidget インスタンスの更新を送信しようとします。

この動作は意図的なものですか?

onUpdate適切なIDでのみ強制的に呼び出される方法はありますか?

影響を受けるインスタンスを他のインスタンスと区別する方法はありますか?

4

1 に答える 1

1

ウィジェットを作成するには、2つのオプションがあります。最初のオプションは構成アクティビティを使用せず、次にすべてのウィジェットが同様に動作し、区別せずにすべてを一度に更新できます。2つ目は、構成アクティビティを使用することです。ここで、呼び出された構成アクティビティから作成されたウィジェットIDを次の方法で取得できます。

Intent intent = getIntent();
Bundle extras = intent.getExtras();
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

このウィジェットIDは、たとえば、構成手順中に定義されたこのウィジェットに関する他の情報を使用して、sqliteに永続化できます。

だからあなたの質問のために:

この動作は意図的なものですか?

答えは「はい」だと思います。構成手順なしで作成されたウィジェットは同様に動作する必要があり、の属性でonUpdate定義された間隔で呼び出されるためです。updatePeriodMillisAppWidgetProviderInfo

onUpdateを適切なIDでのみ呼び出すように強制する方法はありますか?

いいえ。ドキュメントから、そのようなオプションは存在しないことがわかります。

影響を受けるインスタンスを他のインスタンスと区別する方法はありますか?

はい、いつ、どの正確なウィジェットを更新するかを決めることができます。onRecieveこれは、ウィジェットプロバイダークラスで使用することで実現できます。

  • 構成アクティビティを使用して、各ウィジェットIDを永続化します。または、ウィジェットのonClickイベントに保留中のインテントを設定し、このインテント内のウィジェットIDをアクティビティに渡してから永続化します。アイデア-ウィジェットIDを保存して、後でそれらを区別できるようにします。
  • アプリケーション(アクティビティ、サービス、アラームマネージャーなど)から、更新するウィジェットIDを使用してブロードキャストを送信します。
  • onRecieveブロードキャストをキャッチし、ウィジェットIDをフェッチしてから、ウィジェットプロバイダークラスで具象ウィジェットを操作できます。
于 2012-12-14T00:31:29.423 に答える