比如現在的時間是7:00,我設置鬧鐘為6:00,則鬧鐘馬上會啟動。但是如果設置為8:00,則鬧鐘不會立即啟動而是在8:00准時啟動。被這個問題糾結了一天,把自己的代碼和網上其他人開發的鬧鐘程序代碼比來比去沒有什麼差別,可就是無法解決這個問題,終於在剛剛又看了一下核心函數,由其傳入的參數發現了問題的所在。
網上主流的鬧鐘程序一定用到了下面兩行程序:
注意第二行set方法的第一和第二個參數,第一個參數表明使用的是絕對時間,而第二個參數說明是自1970年1月1日0:00至Calendar實例對象設定的時間的毫秒數。好,問題迎刃而解:如果現在的時間是7:00,那麼你設定6:00的鬧鐘,在set方法中傳入的第二個參數的值就會比現在的系統時間的getTimeInMillis()值要小,那麼任務啟動時間早已經提前到了1個小時,所以系統馬上響應這個定時任務。
這樣看來,網上那些主流的鬧鐘開發教程就都面臨一個通病,就是如果設定的鬧鐘時間比當前時間小(即想要鬧鐘在第二天某一時間響),那麼就需要在set方法前先做一個判定,判定設定的鬧鐘時間和當前的系統時間的大小關系:如果設定的時間比系統時間大,那麼不用做什麼額外的操作,正常調用AlarmManager的set方法即可;反之如果設定的鬧鐘時間比當前時間小,那麼需要把Calendar實例對象的Day變量自加1:
代碼中c_set為鬧鐘設定時間的Calendar實例對象,c_cur為當前系統時間的Calendar實例對象。值得注意的是:DAY_OF_YEAR不要寫成DAY,寫成DAY_OF_YEAR的好處是不用考慮月份天數、進位等問題。