【问题标题】:Why is AppWidgetProvider.onUpdate called for all widget instances when new one is added?为什么在添加新的小部件实例时为所有小部件实例调用 AppWidgetProvider.onUpdate?
【发布时间】:2023-03-31 16:50:01
【问题描述】:

我注意到,每当我将同一 AppWidget 的新实例添加到主屏幕时,相应的 AppWidgetProvideronUpdate 方法就会被调用,并使用 @ 中的 all 实例的 ID 987654324@.

reference 明确指出:

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

这种行为是故意的吗?

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

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

【问题讨论】:

    标签: android android-widget android-appwidget


    【解决方案1】:

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

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

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

    所以对于你的问题:

    这种行为是故意的吗?

    我认为答案是——“是”。因为在没有配置步骤的情况下创建的小部件的行为应该相似,并且onUpdate 的调用间隔由AppWidgetProviderInfo 中的updatePeriodMillis 属性定义。

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

    没有。 from doc我知道这个选项不存在。

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

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

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

    【讨论】:

    • 谢谢,我正打算写一个配置活动。我仍然认为这种行为很奇怪。小部件实例共享行为但不共享状态。在不需要的时候更新状态会使用不必要的系统资源。我看不出添加新实例会如何要求其他实例更新。
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多