Android 小部件 - 在哪里注册显式广播

Posted

技术标签:

【中文标题】Android 小部件 - 在哪里注册显式广播【英文标题】:Android widget - Where to register for explicit broadcasts 【发布时间】:2021-10-24 00:37:34 【问题描述】:

处理需要能够从我安装在设备本身上的应用程序接收广播的 android 小部件。基本上希望能够在某些事件发生时通知小部件,以便它们可以更新而不是等待整整 30 分钟。

自定义操作:“com.example.UPDATE”

看起来静态寄存器不再是我的小部件从我的主应用程序接收自定义意图广播的选项,因为它们是独立的实体,并且从文档看来,Google 锁定了静态寄存器的可能性。无论如何,我不想指定单个接收器,因为我希望能够支持多个小部件,并且每个小部件都可以在需要时接收广播。

为小部件的上下文动态注册广播接收器的正确方法是什么?

我是否可以在我的 AppWidgetProvider 的 onUpdate 函数中注册它,并确保每次调用 onUpdate 时它都已注册?这提供了一个我可以将其注册到的上下文。

【问题讨论】:

【参考方案1】:

处理需要能够从我安装在设备本身上的应用程序接收广播的 Android 小部件。

您的行为就像有两个独立的应用程序:“真实”应用程序和应用程序小部件的独立应用程序。我强烈建议你不要走那条路,而是有一个应用程序。在这种情况下,您的应用可以在希望更新应用小部件的 UI 时简单地使用 AppWidgetManager

如果您确信拥有两个独立的应用是正确的方法,请继续阅读。

看起来静态寄存器不再是我的小部件从我的主应用程序接收自定义意图广播的选项,因为它们是独立的实体,并且从文档看来,Google 锁定了静态寄存器的可能性

仅适用于隐式广播。在您的情况下,您可以使用显式广播,您可以在其中识别特定的应用程序或组件来接收广播。 Intent 上的 setPackage() 应该足够了。

为小部件的上下文动态注册广播接收器的正确方法是什么?

实现前台服务并让它注册广播。然后它可以使用AppWidgetManager 来更新您的应用小部件。由于用户不会喜欢这样,我建议你不要走这条路。

我是否可以在 AppWidgetProvider 的 onUpdate 函数中注册它,并确保每次调用 onUpdate 时它都已注册?

不,因为您的进程将在onUpdate() 返回后不久消失,如果没有任何东西保留该进程,例如前台服务。这就是为什么使用清单注册接收器和显式广播是更好的解决方案的原因。

【讨论】:

感谢您的评论。所以我将它们视为独立的应用程序,主要是在更新方面。我没有让 AppWidgetManager 通知每个应用程序小部件,而是考虑让它广播。跟踪所有小部件ID然后循环并通知它们是否更正确? developer.android.com/reference/android/appwidget/…。看起来所有功能都需要远程视图或 id 来更新什么,而我的主应用程序不知道?示例:我想在用户退出应用时通知小部件。 我想你是在使用 AppWidgetManager 卖给我的。我只是对如何仅通过 id 通知小部件并让它运行其常规更新过程有点困惑,就像它已经达到其 30 分钟更新计时器一样。 @Kyle:从编程的角度来看,应用小部件并不是真实的东西。您的建议类似于“通知”BooleanString。应用小部件实际上只是一组 ID,您可以为其推送 RemoteViewsAppWidgetProvider 只是一组回调,可用于维护 ID 列表的副本并在操作系统需要时更新 RemoteViews(独立于您可能想要执行的任何推送)。 “这是我的主应用程序不知道的”——将您的 build-the-RemoteViews 逻辑移动到一个可供AppWidgetProvider 和其他地方使用的类中。 知道了。好吧,我想我终于明白了,感谢所有的信息。特定小部件具有多个 id 是否正常?测试一下: val widgetIds = AppWidgetManager.getInstance(context) .getAppWidgetIds(ComponentName(context, MySpecificWidgetProvider::class.java)) 它似乎为这个特定的小部件返回 2 个 id。此提供程序目前仅支持 1 个小部件。 对我来说这是一个非常愚蠢的错误。我以某种方式/在某些时候将一个小部件拖到了另一个在主屏幕上滑动的小部件上。因此,虽然我只在主屏幕上看到我的实例,但实际上我确实存在第二个实例。感谢大家的帮助,终于掌握了如何使用这些小部件。

以上是关于Android 小部件 - 在哪里注册显式广播的主要内容,如果未能解决你的问题,请参考以下文章

android 广播接收不到可能是哪里出了问题

在页脚区域中为小部件添加第四列

Android 小部件+服务

android 创建桌面小部件widget

将数据广播到 Flutter 中的多个小部件

电池小部件不更新