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

Posted

技术标签:

【中文标题】在Android中以编程方式刷新时被其他内容替换的小部件【英文标题】:Widget replaced by other content when programmatically refreshing in Android 【发布时间】:2012-06-26 03:29:22 【问题描述】:

在 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 是我在onCreate() 中设置一次的Activity 的上下文(this)。上面的方法是在ActivityonStop()方法中调用的。

不幸的是,当它被调用时,它会用其他应用程序的小部件(例如 AP News)替换应用程序的小部件 - 至少在一段时间内。

怎么会这样?代码有问题吗?

谢谢!

编辑#1:更清楚地指出这一点:我已经定义了自动刷新的时间间隔。但除此之外,我想不时从Activity 更新小部件。 This question 表示这也是可能的。

编辑#2:我刚刚看到错误的小部件只显示了几秒钟。之后,我自己的应用程序的小部件再次显示。

【问题讨论】:

过去我在使用小部件时遇到过一些问题。我所做的只是将更新代码移动到服务中。当我需要更新时,启动该服务。我不确定,但问题已经解决。你能试试吗? 非常感谢,这解决了我的问题!不知道为什么(你呢?),但它奏效了。所以 AppWidgetManager.getAppWidgetIds() 不是问题,它工作正常,因为这些 id 然后传递给我的服务。您可以将其写为答案以便我接受吗? :) 很高兴它能帮助你。但我真的不知道原因,所以我不能将其发布为答案。不客气:-) 哦,当然可以。虽然不完整,但这是最好的答案。所以请张贴! ;) 答案并不总是需要解释,最重要的是它有效。 【参考方案1】:

过去我在使用小部件时遇到过一些问题,现在已经解决了。我真的不知道我的解决方案为什么对我有用。因为它适用于Marco W.,所以我把它放在这里:我所做的只是将更新代码移动到服务中。当我需要更新时,启动该服务。同样,我不确定,但问题已经解决了。

感谢 Marco,我获得了更多关于 android 的经验。这很有趣:-)

【讨论】:

谢谢,我很高兴它成功了! :) 也许其他人知道这个解释,有一天会在这里发布...... 是的,它有效!奇怪但真实。唯一需要注意的是:应该使用普通的Service而不是IntentService【参考方案2】:

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

【讨论】:

【参考方案3】:

您是否有理由在小部件之外运行更新功能?在我看来,使用 updatePeriodMillis 属性会更有意义吗?您可以将该属性设置为您希望小部件调用 onUpdate() 的频率,然后它可以提供更新的信息。

http://developer.android.com/guide/topics/appwidgets/index.html#MetaData

【讨论】:

这对我来说绝对清楚。已经在这样做了。不过,在某些情况下,上述内容可能非常有用。 @MarcoW 看看这个函数here 由于它说它缓存视图,它是否可能缓存了另一个小部件的视图? 我不知道。我怎样才能找到这个?这是什么意思? This method will only work when called from the uid that owns the AppWidget provider 它适用于我的情况吗? uid 是什么?

以上是关于在Android中以编程方式刷新时被其他内容替换的小部件的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

在 iOS 中以编程方式将用户带到后台刷新设置

如何在 Android 10 中以编程方式安装任何 Android 应用

如何在 Android 中以编程方式启用禁用 GPS? [复制]

如何在android中以编程方式关闭3G数据连接?

如何在 android Pie 和 UP 中以编程方式打开/关闭扬声器