AlarmManager-鬧鐘服務
AlarmManager簡介
在特定的時刻爲我們廣播一個指定的Intent,簡單來說就是我們自己定一個時間,然後到時間時,
AlarmManager會爲我們廣播一個我們設定好的Intent,比如指向某個Activity或者Service。
獲得AlarmManager實例
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
AlarmManager常用方法解析
- set(int type,long startTime,PendingIntent pi):一次性鬧鐘
- setRepeating(int type,long startTime,long intervalTime,PendingIntent pi):
重複性鬧鐘,和3有區別,3鬧鐘間隔時間不固定- setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi):
重複性鬧鐘,時間不固定- cancel(PendingIntent pi):取消AlarmManager的定時服務
- getNextAlarmClock():得到下一個鬧鐘,返回值AlarmManager.AlarmClockInfo
- setAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
和set方法類似,這個鬧鐘運行在系統處於低電模式時有效- setExact(int type, long triggerAtMillis, PendingIntent operation):在規定的時間精確的執行鬧鐘,比set方法設置的精度更高
- setTime(long millis):設置系統牆上的時間
- setTimeZone(String timeZone):設置系統持續的默認時區
- setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation):
設置一個鬧鐘在給定的時間窗觸發。類似於set,該方法允許應用程序精確地控制操作系統調
整鬧鐘觸發時間的程度。
關鍵參數解析
- Type(鬧鐘類型):
有五個可選值:
AlarmManager.ELAPSED_REALTIME:
鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間(相對於系統啓動開始),狀態值爲3;
AlarmManager.ELAPSED_REALTIME_WAKEUP:
鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間,狀態值爲2;
AlarmManager. RTC
鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間,即當前系統時間,狀態值爲1;
AlarmManager.RTC_WAKEUP
表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間,狀態值爲0;
AlarmManager.POWER_OFF_WAKEUP
表示鬧鐘在手機關機狀態下也能正常進行提示功能,所以是5個狀態中用的最多的狀態之一,該狀態下鬧鐘也是用絕對時間,狀態值爲4;不過本狀態好像受SDK版本影響,某些版本並不支持;- startTime:鬧鐘的第一次執行時間,以毫秒爲單位,可以自定義時間,不過一般使用當前時間。
需要注意的是,本屬性與第一個屬性(type)密切相關,如果第一個參數對應的鬧鐘使用的是相對時間
(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那麼本屬性就得使用相對時間
(相對於系統啓動時間來說),比如當前時間就表示爲:SystemClock.elapsedRealtime();
如果第一個參數對應的鬧鐘使用的是絕對時間(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),
那麼本屬性就得使用絕對時間,比如當前時間就表示 爲:System.currentTimeMillis()。- intervalTime:表示兩次鬧鐘執行的間隔時間,也是以毫秒爲單位.
- PendingIntent:綁定了鬧鐘的執行動作,比如發送一個廣播、給出提示等等。
PendingIntent是Intent的封裝類。需要注意的是,如果是通過啓動服務來實現鬧鐘提 示的話,PendingIntent對象的獲取就應該採用Pending.getService
(Context c,int i,Intent intent,int j)方法;如果是通過廣播來實現鬧鐘
提示的話,PendingIntent對象的獲取就應該採用 PendingIntent.getBroadcast
(Context c,int i,Intent intent,int j)方法;如果是採用Activity的方式來實
現鬧鐘提示的話,PendingIntent對象的獲取就應該採用
PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。
如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。