Android Widget未更新

时间:2010-01-16 16:41:07

标签: android widget android-appwidget

我正在尝试实现一个简单的小部件,以便在主屏幕上显示。我遇到的问题是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 个答案:

答案 0 :(得分:68)

android:updatePeriodMillis设置为20秒时,最短实际时间为30分钟。因此,如果您在测试期间没有等待30分钟查看是否有更新,则需要等待一段时间。

答案 1 :(得分:19)

来自SDK:

注意:如果设备在更新时(由updatePeriodMillis定义)处于睡眠状态,则设备将被唤醒以执行更新。如果每小时更新不超过一次,这可能不会导致电池寿命出现严重问题。

但是,如果您需要更频繁地更新和/或在设备处于睡眠状态时无需更新,则可以根据不会唤醒设备的警报执行更新。

要执行此操作,请使用AppWidgetProvider设置警报,其中包含AlarmManager收到的意图。将警报类型设置为ELAPSED_REALTIMERTC,这只会在设备处于唤醒状态时发出警报。然后将updatePeriodMillis设置为zero(“0”)。

当SDK 1.6 +:

注意: updatePeriodMillis请求的更新不会每30分钟发送一次。

答案 2 :(得分:1)

正如duduli所说...使用alarmManager向你的Widget类发送一个意图,如果你不知道怎么做就跟着this guide,它会在onReceive方法中接收它。它对我和其他人有用