0

我注意到,每当我将同一个 AppWidget 的新实例添加到主屏幕AppWidgetProvideronUpdate都会使用appWidgetIds.

参考文献明确指出:

EXTRA_APPWIDGET_IDS 要更新的 appWidgetId。这可能是为此提供程序创建的所有 AppWidget,或者只是一个子集。系统尝试为尽可能少的 AppWidget 实例发送更新。

这种行为是故意的吗?

有没有办法强制onUpdate只使用适当的 id 被调用?

有没有办法将受影响的实例与其他实例区分开来?

4

1 回答 1

1

创建小部件有两个选项:第一个选项是不使用配置活动,然后所有小部件的行为相似,它们都可以立即更新而无需区分。第二个是使用配置活动。在那里,您可以通过以下方式获取刚刚从调用的配置活动创建的小部件 ID:

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

您可以将这个小部件 ID 保存在 sqlite 中,例如在配置步骤时定义的关于这个小部件的其他信息。

所以对于你的问题:

这种行为是故意的吗?

我认为答案是 - '是的'。onUpdate因为在没有配置步骤的情况下创建的小部件应该表现相似,并且updatePeriodMillisAppWidgetProviderInfo.

有没有办法强制仅使用适当的 id 调用 onUpdate?

,从文档中我可以了解到这样的选项不存在。

有没有办法将受影响的实例与其他实例区分开来?

是的,您可以决定何时更新哪个确切的小部件。您可以通过onRecieve在小部件提供程序类中使用来实现此目的:

  • 使用配置活动并保留每个小部件 ID。或者将挂起的意图设置为小部件中的 onClick 事件,并将此意图中的小部件 id 传递给活动,然后将其持久化。这个想法 - 保存小部件 id,以便以后能够在它们之间有所不同。
  • 从您的应用程序(活动、服务、警报管理器..)发送带有您要更新的小部件 ID 的广播。
  • onRecieve将捕获广播,将获取小部件 ID,然后您可以在小部件提供程序类中使用具体小部件。
于 2012-12-14T00:31:29.423 回答