安卓小部件未更新

39

我正在尝试实现一个简单的小部件,用于在主屏幕上显示。我遇到的问题是,在安装小部件时onUpdate只被调用一次。以下是配置信息。注意:我不会将更新周期保留为20秒,因为我知道这样会消耗电池(只是测试)。

配置:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   android:minWidth="294dp"
   android:minHeight="72dp"
   android:updatePeriodMillis="20000"
   android:initialLayout="@layout/my_custom_app_widget">`
</appwidget-provider>`

清单摘录:

<receiver android:name="MyCustomWidgetProvider">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/my_custom_app_widget_info" />
</receiver>
我安装小部件时观察到以下行为: 在我的WidgetProvider类中,先调用onReceive,然后是onEnabled,再调用onReceive,最后是onUpdate。
之后小部件会显示出来,但onUpdate永远不会再被调用。我还检查了当onUpdate被调用时提供程序的设置,并且XML中设置的所有内容(例如更新周期)都是正确的。
3个回答

72

如果你将android:updatePeriodMillis设置为20秒,实际的最短时间是30分钟。因此,在测试期间如果你没有等待30分钟来查看是否有更新,就需要稍等一下了。Android 文档 - updatePeriodMillis


3
谢谢。我正在逐行查看文件,但它们并没有提到这一点。不过,根据你的回答,我进一步深入研究,发现我正在查看1.5版的文档。最低要求已经有记录了,如果需要更高的更新频率,则似乎有一种警报方法。谢谢。 - phogel
2
时钟或天气更新小部件怎么样?它们是如何更新的。 - Brijesh Masrani
4
如果你们中有人在开发 API:这不是正确的方法。如果有值范围的限制,一定要在编译时或最坏情况下的运行时明确告知消费者,以避免错误。请注意不改变原意。 - Nilzor

20

来自SDK:

注意:如果设备在更新时间(由updatePeriodMillis定义)时处于睡眠状态,则设备将会被唤醒以执行更新。如果您不需要每小时更新一次以上,那么这可能不会对电池寿命造成显著问题。

然而,如果您需要更频繁地更新和/或您不需要在设备睡眠时更新,则可以基于闹钟执行更新,这样就不会唤醒设备。

为此,请使用AlarmManager设置一个Intent,该Intent将由您的AppWidgetProvider接收。将闹钟类型设置为ELAPSED_REALTIMERTC,这样只有在设备清醒时才会发送闹钟信号。然后将updatePeriodMillis设置为(“0”)。

当SDK 1.6+时:

注意:使用updatePeriodMillis请求的更新将不会在30分钟内传递超过一次。


2

正如duduli所说...使用AlarmManager发送一个意图到你的小部件类,它将在其onReceive方法中接收它。如果你不知道如何操作,请遵循这个指南。它对我和其他人都有效。


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