在Android中以编程方式刷新时,小部件被其他内容替换。

3

在 Stack Overflow 上的某个地方,有一天我发现了以下代码,稍微调整了一下以适应我的应用:

private void updateWidget() {
    AppWidgetManager widgetManager = AppWidgetManager.getInstance(ctx);
    ComponentName widgetComponent = new ComponentName(ctx, MyAppWidgetProvider.class);
    int[] widgetIds = widgetManager.getAppWidgetIds(widgetComponent);
    Intent update = new Intent();
    update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);
    update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    ctx.sendBroadcast(update);
}

这将以编程方式刷新应用程序小部件的所有实例。`ctx` 是 `Activity` 的上下文(即 `this`),我在 `onCreate()` 中设置了一次。上面的方法在 `Activity` 的 `onStop()` 方法中调用。
不幸的是,当它被调用时,它会替换应用程序小部件为其他应用程序的小部件(例如 AP News)- 至少有一段时间。
这是怎么发生的?代码有问题吗?
谢谢!
编辑#1:更明确地指出:我已经定义了自动刷新的间隔。但除此之外,我还想不时地从 `Activity` 更新小部件。 这个问题也提出了可能性。
编辑#2:我刚刚看到错误的小部件只显示了几秒钟。之后,我的应用程序的小部件再次显示。

我之前遇到过一些小部件的问题。我所做的只是将更新代码移动到了一个服务中。需要更新时,启动该服务即可。我不确定这是否适用于你的情况,但那个问题已经得到解决。你可以试一下吗? - user942821
非常感谢,这解决了我的问题!不知道为什么(你知道吗?),但它起作用了。所以 AppWidgetManager.getAppWidgetIds() 不是问题,它很好地工作,因为这些 ID 然后传递给我的服务。你能把它写成答案,这样我就可以接受它了吗? :) - caw
我很高兴它能帮到你。但是我真的不知道原因,所以我不能把它作为答案发布。不客气 :-) - user942821
当然可以。虽然它不完整,但这是最好的答案。所以请发布它!;) 答案并不总是需要解释,最重要的是它能够工作。 - caw
3个回答

4

我过去在小部件方面遇到了一些问题,并且已经解决了它们。我真的不知道为什么我的解决方案对我有效。正如它对Marco W.有效一样,所以我将其放在这里:我所做的就是将更新代码移到一个服务中。当我需要更新时,启动该服务。再次声明,我不确定这是否正确,但问题已得到解决。

感谢Marco,我在Android上获得了更多经验,这很有趣 :-)


1
谢谢,我很高兴它能够正常工作! :) 或许有人知道其中的解释并会在这里发布... - caw
是的,它有效!奇怪但却是真的。唯一需要注意的是:应该使用普通的Service而不是IntentService。 - Barmaley

0
我通过使用notifyAppWidgetViewDataChanged方法解决了这个问题,该方法允许更新所有小部件。我的解释是,在修改集合视图(在我的情况下为StackView)中包含的数据后,该方法可以更新它。

-1

这对我来说非常清楚。已经在做了。尽管如此,有些情况下上述事物可能非常有用。 - caw
@MarcoW 请看一下这个函数链接 由于它说它缓存视图的方式,它可能会缓存另一个小部件的视图吗? - Avery
我不知道。我该如何找到答案?这里的意思是什么?此方法仅在从拥有AppWidget提供程序的uid调用时才起作用。它适用于我的情况吗?什么是uid - caw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接