天天看點

多個循環的AlarmManager管理

本文涉及内容:

一,如何設定多個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;
	}