为啥我们必须从一个小部件更新多个小部件?

Posted

技术标签:

【中文标题】为啥我们必须从一个小部件更新多个小部件?【英文标题】:Why do we have to update multiple widgets from one widget?为什么我们必须从一个小部件更新多个小部件? 【发布时间】:2018-02-02 03:25:11 【问题描述】:

我在 android 中只写了几个小部件,但有一件事总是让我感到好奇。在 onUpdate() 方法中,我们遍历所有的小部件 ID,它说 可以有多个处于活动状态的小部件,因此全部更新它们。但是为什么我们必须像这样从一个小部件更新其他小部件?

override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) 
    // There may be multiple widgets active, so update all of them
    for (appWidgetId in appWidgetIds) 
        updateAppWidget(context, appWidgetManager, appWidgetId)
    

每个小部件都有自己的 Broadcast reviever,每个小部件都可以自行运行。为什么我们必须从另一个小部件调用更新?

如果这是一个非常简单的逻辑,请轻松回答我的问题。

【问题讨论】:

我很确定如果小部件注册为广播接收器,您不需要更新它。如果不是,您确实需要。 【参考方案1】:

每个小部件都有自己的广播恢复器

不,它没有。

首先,AppWidgetProvider 类处理该提供程序提供的所有应用小部件。如果用户创建了该应用小部件的多个实例(例如,多个城市的天气报告),则所有这些实例都由单个 AppWidgetProvider 类更新。

其次,AppWidgetProvider 的单个实例用于单个 onUpdate() 调用。这是因为AppWidgetProviderBroadcastReceiver 的子类,onUpdate()onReceive() 触发,并且清单注册的BroadcastReceiver 在每次onReceive() 调用时都会获得一个唯一的实例。

【讨论】:

感谢您提供如此有见地的段落。 嘿@Co​​mmonsWare,有没有办法只更新一个小部件(我有多个实例,正如你提到的)但是分离数据的最佳方法是什么)***.com/questions/56545567/update-single-widget @Jeroen:每个应用小部件都有一个 ID。如果您在调用中将该 ID 传递给 AppWidgetManager,它只会更新该特定应用小部件实例,而不是其他实例。 @CommonsWare 但我如何获得此 ID?当我使用我在之前评论中的链接中发布的代码时,我总是为所有小部件获得相同的 ID。 @Jeroen:“但是我如何获得这个 ID?” -- onUpdate() 被传递给它们的数组,每个小部件一个 ID。 “我总是为所有小部件获得相同的 ID”——你是说有 N 个小部件并且数组只有一个元素吗?还是说有N个widget,数组有N个元素,但是数组中的每个元素都是同一个值?

以上是关于为啥我们必须从一个小部件更新多个小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个小部件状态处理一个小部件状态?

如何在 Flutter 中重用 Stack 小部件的子级

为啥我的应用小部件没有在 API 3 或 4 中更新?

在 Android 中更新多个应用小部件

多个 Android Widget 实例仅更新最后一个小部件

如何从另一个小部件类更新小部件树 - Flutter