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

时间:2012-06-24 17:50:59

标签: android android-widget

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()方法中调用。

不幸的是,当它被调用时,它会替换其他应用程序的应用程序小部件。小部件(例如美联社新闻) - 至少有一段时间。

这怎么可能发生?代码中有什么问题吗?

谢谢!

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

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