哪个值具有更高的优先级,updatePeriodMillis或与Alarm相关联的值?

时间:2014-06-27 02:36:28

标签: android anti-patterns

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

这种方法的缺点在于,如果手机正在睡眠,它会以指定的时间间隔唤醒手机来更新widget。所以问题在于电池消耗 如果间隔非常小,这是一个主要问题。

但是,如果您需要更频繁地更新和/或在设备处于睡眠状态时不需要更新,那么您可以根据将要发生的警报执行更新 不要唤醒设备。为此,请使用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 NOT 设置为0,那么 哪个值优先?作为Alarm或updatePeriodMillis?

的一部分指定的值

2 个答案:

答案 0 :(得分:5)

它们都会触发onUpdate()来电。

如果您在20分钟和updatePeriodMillis到30分钟设置闹钟。

然后你将widget放在主屏幕上。 20分钟后,警报将触发onUpdate被调用(可以是您实际选择的任何其他功能)。然后10分钟后(总共在屏幕上放置小部件后30分钟),updatePeriodMillis将触发onUpdate()。然后10分钟后(自小部件放置在屏幕上40分钟后),闹钟将触发另一个onUpdate()。最后20分钟后(自小部件放置在屏幕上60分钟后)updatePeriodMillis将触发另一个onUpdate()

答案 1 :(得分:2)

来自android DOC: 注意:updatePeriodMillis请求的更新不会每30分钟发送一次。 [在此输入链接描述] [1] http://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo.html#updatePeriodMillis

所以基本上如果你将updatePeriodMillis设置为低于1800000,android将不会调用你的onUpdate方法直到30分钟