我了解参数updatePeriodMillis
确定了根据/res/xml中widget
中的规范更新应用widgetproviderinfo.xml
的频率
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:configure="com.example.appwidget.ConfigurationActivity"
android:initialLayout="@layout/layout_appwidget_large"
android:minHeight="115dp"
android:minWidth="250dp"
android:updatePeriodMillis="1800000" ><!-- 30mins -->
</appwidget-provider>
该方法的缺点在于,如果电话处于 sleep 状态,则通过以指定的间隔唤醒电话来更新
widget
。所以问题是关于电池消耗如果间隔很小,这是一个主要问题。
但是,如果您需要更频繁地更新和/或不需要在设备处于 sleep 状态时进行更新,则可以根据将执行以下操作的警报来执行更新:
不唤醒设备。为此,请使用
Intent
将您的AppWidgetProvider
收到的AlarmManager
设置为警报。将警报类型设置为ELAPSED_REALTIME或RTC,仅在设备苏醒时才会发出警报。然后将
updatePeriodMillis
设置为零(“0”)。至代码看起来像这样:
final Intent intent = new Intent(context, UpdateService.class);
final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0);
final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pending);
long interval = 1000*60;
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),interval, pending);
所以我的问题如下:
假设使用AlarmManager进行更新。此外,如果在widgetproviderinfo.xml中,将updatePeriodMillis的而不是设置为0,则
哪个值优先?在Alarm或updatePeriodMillis?中指定的值?
最佳答案
它们都将触发onUpdate()
调用。
如果您将闹钟设置为20分钟,将updatePeriodMillis
设置为30分钟。
然后,您将widget
放在主屏幕上。 20分钟后,警报将触发onUpdate
调用(实际上可以是您选择的任何其他功能)。然后10分钟后(总共从窗口小部件放到屏幕上30分钟),updatePeriodMillis
将触发onUpdate()
。然后10分钟后(距离窗口小部件放置在屏幕上40分钟),警报将触发另一个onUpdate()
。最后20分钟后(距离窗口小部件放置在屏幕上60分钟),updatePeriodMillis
将触发另一个onUpdate()
。