为啥我们必须从一个小部件更新多个小部件?
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()
调用。这是因为AppWidgetProvider
是BroadcastReceiver
的子类,onUpdate()
由onReceive()
触发,并且清单注册的BroadcastReceiver
在每次onReceive()
调用时都会获得一个唯一的实例。
【讨论】:
感谢您提供如此有见地的段落。 嘿@CommonsWare,有没有办法只更新一个小部件(我有多个实例,正如你提到的)但是分离数据的最佳方法是什么)***.com/questions/56545567/update-single-widget @Jeroen:每个应用小部件都有一个 ID。如果您在调用中将该 ID 传递给AppWidgetManager
,它只会更新该特定应用小部件实例,而不是其他实例。
@CommonsWare 但我如何获得此 ID?当我使用我在之前评论中的链接中发布的代码时,我总是为所有小部件获得相同的 ID。
@Jeroen:“但是我如何获得这个 ID?” -- onUpdate()
被传递给它们的数组,每个小部件一个 ID。 “我总是为所有小部件获得相同的 ID”——你是说有 N 个小部件并且数组只有一个元素吗?还是说有N个widget,数组有N个元素,但是数组中的每个元素都是同一个值?以上是关于为啥我们必须从一个小部件更新多个小部件?的主要内容,如果未能解决你的问题,请参考以下文章