我正在尝试实现一个简单的小部件,以便在主屏幕上显示。我遇到的问题是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设置的所有内容(例如更新周期)都是正确的。
答案 0 :(得分:68)
当android:updatePeriodMillis
设置为20秒时,最短实际时间为30分钟。因此,如果您在测试期间没有等待30分钟查看是否有更新,则需要等待一段时间。
答案 1 :(得分:19)
来自SDK:
注意:如果设备在更新时(由updatePeriodMillis
定义)处于睡眠状态,则设备将被唤醒以执行更新。如果每小时更新不超过一次,这可能不会导致电池寿命出现严重问题。
但是,如果您需要更频繁地更新和/或在设备处于睡眠状态时无需更新,则可以根据不会唤醒设备的警报执行更新。
要执行此操作,请使用AppWidgetProvider
设置警报,其中包含AlarmManager
收到的意图。将警报类型设置为ELAPSED_REALTIME
或RTC
,这只会在设备处于唤醒状态时发出警报。然后将updatePeriodMillis
设置为zero
(“0”)。
当SDK 1.6 +:
时 注意: updatePeriodMillis
请求的更新不会每30分钟发送一次。
答案 2 :(得分:1)
正如duduli所说...使用alarmManager向你的Widget类发送一个意图,如果你不知道怎么做就跟着this guide,它会在onReceive方法中接收它。它对我和其他人有用