我了解参数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()

10-07 18:43