我的应用程序有一个小部件,显示今天的日期并需要在午夜时更新。该小部件在清单中定义为
<manifest>
...
<application>
...
<receiver
android:name=".MyWidgetProviderClass"
android:label="MyLabel" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_icon_info" />
</receiver>
</application>
</manifest>
小部件信息文件是
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/my_layout"
android:minHeight="40dp"
android:minWidth="294dp"
android:updatePeriodMillis="3600000" >
</appwidget-provider>
这个小部件的更新时间在午夜到下午1点之间随机发生,但我希望它能在更接近午夜的时候进行更新,因此我添加了一个意图接收器。
<receiver
android:name=".MyWidgetUpdaterClass"
android:enabled="true" >
<intent-filter>
<action android:name="MyAction" />
</intent-filter>
</receiver>
以及一个静态方法
public static void setMidngintAlarms(Context context) {
Intent intent = new Intent("MyAction");
PendingIntent pendingIntent =
PendingIntent.getBroadcast(context, 0, intent, 0);
long interval = 24*60*60*1000;
long firstTime = SystemClock.elapsedRealtime() +
millisecondsToNextMidnight();
AlarmManager am = (AlarmManager)context.getSystemService(
Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
firstTime, interval, pendingIntent);
}
(由于闹钟管理器使用相同的意图请求会相互覆盖,因此多次调用setMidngintAlarms没有坏处。)我尝试从几个位置调用setMidnightAlarms()(从应用程序的主活动中,从AppWidgetProvider的onUpdate()等)。一切都很顺利,闹钟管理器意图被接收并更新小部件,但只要应用程序运行。如果我杀死应用程序,小部件在午夜停止更新。 有什么办法在午夜时更新小部件吗?我需要添加一个服务吗?如果需要,怎样添加?有任何例子吗? 我有点惊讶这个基本功能如此复杂需要这么久才能工作。