android AlarmManager 設定時間小於當前時間,立即觸發廣播解決方案
最近在做一個基於android作業系統的鬧鐘小程式,在網上找尋了很多資料,根據這些資料試著編寫,但是在測試的時候遇到了如下一個問題:
比如現在的時間是7:00,我設定鬧鐘為6:00,則鬧鐘馬上會啟動。但是如果設定為8:00,則鬧鐘不會立即啟動而是在8:00準時啟動。被這個問題糾結了一天,把自己的程式碼和網上其他人開發的鬧鐘程式程式碼比來比去沒有什麼差別,可就是無法解決這個問題,終於在剛剛又看了一下核心函式,由其傳入的引數發現了問題的所在。
網上主流的鬧鐘程式一定用到了下面兩行程式:
-
am= (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
- am.set(AlarmManager.RTC_WAKEUP, c_set.getTimeInMillis(), pIntent);
注意第二行set方法的第一和第二個引數,第一個引數表明使用的是絕對時間,而第二個引數說明是自1970年1月1日0:00至Calendar例項物件設定的時間的毫秒數。好,問題迎刃而解:如果現在的時間是7:00,那麼你設定6:00的鬧鐘,在set方法中傳入的第二個引數的值就會比現在的系統時間的getTimeInMillis()值要小,那麼任務啟動時間早已經提前到了1個小時,所以系統馬上響應這個定時任務。
這樣看來,網上那些主流的鬧鐘開發教程就都面臨一個通病,就是如果設定的鬧鐘時間比當前時間小(即想要鬧鐘在第二天某一時間響),那麼就需要在set方法前先做一個判定,判定設定的鬧鐘時間和當前的系統時間的大小關係:如果設定的時間比系統時間大,那麼不用做什麼額外的操作,正常呼叫AlarmManager的set方法即可;反之如果設定的鬧鐘時間比當前時間小,那麼需要把Calendar例項物件的Day變數自加1:
- if(c_cur.getTimeInMillis()> c_set.getTimeInMillis()){
- c_set.set(Calendar.DAY_OF_YEAR, c_set.get(Calendar.DAY_OF_YEAR) + 1);
- }
程式碼中c_set為鬧鐘設定時間的Calendar例項物件,c_cur為當前系統時間的Calendar例項物件。值得注意的是:DAY_OF_YEAR不要寫成DAY,寫成DAY_OF_YEAR的好處是不用考慮月份天數、進位等問題。
轉載自:http://blog.csdn.net/yuanbohx/article/details/7161131