我正在实现一个 AlarmManager 来请求我的应用程序的更新,这应该每天只发生一次。我不希望警报在警报创建后立即响起。为此,我创建了一个日历对象。
每当创建警报时,它也会触发。请注意,这并不总是发生。我注意到这个问题只发生在一天中的特定时间。我住在香港,我希望我所在的时区没有任何问题。除了使用 AlarmManager.INTERVAL_DAY,我还尝试使用 24*60*60*1000。仅当日历轧机比当前轧机旧时才会发生这种情况。在删除此问题之前,我将检查当前时间是否较新并在日历对象中添加 24*60*60*1000。
这是一个创建 AlarmManager 的服务。该服务也在启动时启动。只是为了确保 dataPreferenceObj,它是我的应用程序中 DataPreference 类的一个实例,它为我的应用程序处理与 SharedPreferences 相关的调用。而 ACTION_SCHEDULE_ALARM 是 Keys ENUM 类的一部分,它包含所有字符串常量。
public class TukiService extends Service {
private static AlarmManager calendarAlarmManager;
private static PendingIntent calendarPendingIntent;
private static final int SCHEDULE_REQUEST_CODE = 1001;
@Override
public void onCreate() {
super.onCreate();
updateScheduleUpdate();
}
private static void updateScheduleUpdate() {
if (dataPreferenceObj.getEnabledUpdate() == true) {
cancelScheduleUpdate();
requestScheduleUpdate();
} else if (dataPreferenceObj.getEnabledUpdate() == false) {
cancelScheduleUpdate();
}
}
private static void requestScheduleUpdate() {
setScheduleAlarmParamaters();
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
scheduleAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
schedulePendingIntent);
}
/*
* Cancels an existing alarm if user doesn't want to auto update.
*/
private static void cancelScheduleUpdate() {
setScheduleAlarmParamaters();
scheduleAlarmManager.cancel(schedulePendingIntent);
}
private static void setScheduleAlarmParamaters() {
Intent intent = new Intent(Keys.ACTION_SCHEDULE_ALARM.toString(),
Uri.parse(Long.toString(SCHEDULE_REQUEST_CODE)), context,
AlarmReceiver.class);
schedulePendingIntent = PendingIntent.getBroadcast(mContext,
SCHEDULE_REQUEST_CODE, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
scheduleAlarmManager = (AlarmManager) mContext
.getSystemService(Context.ALARM_SERVICE);
}
}
这是一个接收广播的广播接收器:
public class ScheduleReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Keys.ACTION_SCHEDULE_ALARM.toString())) {
if (TukiService.SCHEDULE_REQUEST_CODE == Long.parseLong(intent
.getData().getSchemeSpecificPart())) {
new NetworkHandler(context).fetchAutoEnabledUpdate();
}
}
}
}
这是我在 mainfest 中的接收者声明:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver
android:name="com.milanix.tuki.service.ScheduleReceiver"
android:enabled="true" >
</receiver>
<service android:name="com.milanix.tuki.service.TukiService" >
</service>