本文涉及内容:
一,如何設定多個AlarmManager提醒
二,多個循環的AlarmManager邏輯管理
最近在搗鼓的一個小proj涉及到需要定時提醒的問題,每天的三個特定時間到點提醒。涉及到類似問題的,我覺得AlarmManager是最佳選擇,簡單粗暴。因為之前就用過AlarmManager,是以感覺輕車熟路,沒想到一開始就碰壁了,首先是一打開程式,就會莫名其妙地提醒,其次,存在鬧鐘被覆寫的問題。現在終于都搞定了,是以mark一下。
一,如何設定多個AlarmManager提醒
這裡主要要解決的是多個AlarmManager會被覆寫的問題。解決這個問題,需要借助PendingIntent的request code,因為我需要的是到時間彈出一個AlertDialog提醒,是以我就用PendingIntent的getActivity方法:
其中的requestCode就是用于區分每個PendingIntent的code。在定義多個AlarmManager提醒的時候需要特别注意,每個提醒的requestCode的獨特性,不可都設成一個值。其實仔細一想也非常好了解,就像要cancel一個AlarmManager的時候也是隻需要它的PendingIntent就ok。PendingIntent是這個全局提醒到點時所需要的信差,隻是這個信差是one to one的vip服務。如在我自己的小proj中,我用private static final的int來制定每個requestCode:
Intent intent = new Intent(getApplicationContext(),
AlarmSetActivity.class);
PendingIntent pendingIntentUp = PendingIntent.getActivity(
CheckActivity.this, UP, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pendingIntentStudy = PendingIntent.getActivity(
CheckActivity.this, STUDY, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pendingIntentSleep = PendingIntent.getActivity(
CheckActivity.this, SLEEP, intent, PendingIntent.FLAG_UPDATE_CURRENT);
另外,提醒大家,PendingIntent中的flags May be FLAG_ONE_SHOT , FLAG_NO_CREATE , FLAG_CANCEL_CURRENT , FLAG_UPDATE_CURRENT , or any of the flags as supported by Intent.fillIn() to control which unspecified parts of the intent that can be supplied when the actual send happens. 要是想用flags前,注意先看看文檔。
二,多個循環的AlarmManager邏輯管理
因為我這裡需要的多個AlarmManager是系統自定義的時間,而不是通過一個TimePickerDialog來拾取,然後又因為是一個每天循環的鬧鐘,是以就容易出現這樣的問題,就是一打開程式,就會莫名其妙地提醒。檢視了API後發現,産生這個問題的原因在于:If the time occurs in the past, the alarm will be triggered immediately. 是以在循環的時間邏輯設定上一定要注意,否則一打開,程式一看這個時間已經是past了,它就直接來一個提醒就搞笑了。這裡貼上自己的判斷,供大家參考:
// 計算距離下一次發送的時間
long triggerAtMillisUp = settaigger(6, 30) + System.currentTimeMillis();
long triggerAtMillisStudy = settaigger(20, 0)
+ System.currentTimeMillis();
long triggerAtMillisSleep = settaigger(22, 0)
+ System.currentTimeMillis();
long intervalMillis = 24 * 60 * 60 * 1000;// 每天重複
private static long settaigger(int h, int m) {
Calendar c = Calendar.getInstance();
int hour_current = c.get(Calendar.HOUR_OF_DAY);
int minute_current = c.get(Calendar.MINUTE);
int hh = 0;
int mm = 0;
if (hour_current < h) {
hh = h - hour_current;
mm = m - minute_current;
} else if (hour_current == h && minute_current <= m) {
hh = h - hour_current;
mm = m - minute_current;
} else if (hour_current == h && minute_current > m) {
hh = 24;
mm = m - minute_current;
}else if (hour_current > h) {
hh = 24 - hour_current + h;
mm = m - minute_current;
}
System.out.println("hh ==" + hh + "mm==" + mm);
int millis = hh * 60 * 60 * 1000 + mm * 60 * 1000;
return millis;
}