Android Alarm manager定時鬧鐘開發詳解

Android Alarm manager定時鬧鐘開發詳解

Alarmmanager主要管理硬件時鐘。 一些與時間相關的應用,如日曆,鬧鐘等須要使用AlarmManager的服務。Alarmmanager 功能相對比較簡單,相關代碼位於 frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp frameworks/base/services/java/com/android/server/AlarmManagerService.java 一.frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp 這部分代碼直接管理硬件時鐘,設備名爲/dev/alarm。包括打開設備,關閉設備,設置時區, 設置觸發時間(timeout),以及等待時鐘觸發。 二.frameworks/base/services/java/com/android/server/AlarmManagerService.java 這部分封裝目錄一中的代碼,向上提供java接口,同時與客戶端(如calendar)交互,接 收來自客戶端的時鐘設置請求,並在時鐘觸發時通知客戶端。 Alarm是在預約的時間上觸發Intent的一種獨立的方法。 Alarm超出了應用程序的做用域,因此它們能夠用於觸發應用程序事件或動做,甚至在應用 程序關閉以後。與BroadcastReceiver結合,它們能夠變得尤爲的強大,能夠經過設置Alarm 來啓動應用程序或者執行動做,而應用程序不須要打開或者處於活躍狀態。 舉個例子,你可使用Alarm來實現一個鬧鐘程序,執行正常的網絡查詢,或者在「非高峯」 時間安排耗時或有代價的操做。 對於僅在應用程序生命週期內發生的定時操做,Handler類與Timer和Thread類的結合是 一個更好的選擇,它容許Android更好地控制系統資源。 Android中的Alarm在設備處於睡眠模式時仍保持活躍,它能夠設置來喚醒設備;然而,所 有的Alarm在設備重啓時都會被取消。 Alarm的操做經過AlarmManager來處理,經過getSystemService能夠得到其系統服務,如 下所示: AlarmManageralarms=(AlarmManager)getSystemService(Context.ALARM_SERVICE); 爲了建立一個新的Alarm,使用set方法並指定一個Alarm類型、觸發時間和在Alarm觸發 時要調用的Intent。若是你設定的Alarm發生在過去,那麼,它將當即觸發。 這裏有4種Alarm類型。你的選擇將決定你在set方法中傳遞的時間值表明什麼,是特定的 時間或者是時間流逝:  RTC_WAKEUP 在指定的時刻(設置Alarm的時候),喚醒設備來觸發Intent。  RTC 在一個顯式的時間觸發Intent,但不喚醒設備。  ELAPSED_REALTIME 從設備啓動後,若是流逝的時間達到總時間,那麼觸發Intent,但不喚醒設備。流逝的時 間包括設備睡眠的任什麼時候間。注意一點的是,時間流逝的計算點是自從它最後一次啓動算起。  ELAPSED_REALTIME_WAKEUP 從設備啓動後,達到流逝的總時間後,若是須要將喚醒設備並觸發Intent。 Alarm的建立過程演示以下片斷所示: intalarmType=AlarmManager.ELAPSED_REALTIME_WAKEUP; longtimeOrLengthofWait=10000; StringALARM_ACTION=「ALARM_ACTION」; IntentintentToFire=newIntent(ALARM_ACTION); PendingIntentpendingIntent=PendingIntent.getBroadcast(this,0,intentToFire, 0); alarms.set(alarmType,timeOrLengthofWait,pendingIntent); 當Alarm到達時,你指定的PendingIntent將被觸發。設置另一個Alarm並使用相同的 PendingIntent來替代以前存在的Alarm。 取消一個Alarm,調用AlarmManager的cancel方法,傳入你再也不但願被觸發的 PendingIntent,以下面的代碼所示: alarms.cancel(pendingIntent); 接下來的代碼片斷中,設置了兩個Alarm,隨後立刻取消了第一個Alarm。第一個Alarm顯 式地設置了在特定的時間喚醒設備併發送Intent。第二個設置爲從設備啓動後,流逝時間 爲30分鐘,到達時間後若是設備在睡眠狀態也不會喚醒它。 AlarmManageralarms=(AlarmManager)getSystemService(Context.ALARM_SERVICE); StringMY_RTC_ALARM=「MY_RTC_ALARM」; StringALARM_ACTION=「MY_ELAPSED_ALARM」; PendingIntentrtcIntent=PendingIntent.getBroadcast(this,0,new Intent(MY_RTC_ALARM),1); PendingIntentelapsedIntent=PendingIntent.getBroadcast(this,0,new Intent(ALARM_ACTION),1); //Wakeupandfireintentin5hours.(註釋可能有錯) Datet=newDate(); t.setTime(java.lang.System.currentTimeMillis()+60*1000*5); alarms.set(AlarmManager.RTC_WAKEUP,t.getTime(),rtcIntent); //Fireintentin30minsifalreadyawake. alarms.set(AlarmManager.ELAPSED_REALTIME,30*60*1000,elapsedIntent); //Cancelthefirstalarm. alarms.cancel(rtcIntent); Alarmmanager主要管理硬件時鐘。 一些與時間相關的應用,如日曆,鬧鐘等須要使用AlarmManager的服務。Alarmmanager 功能相對比較簡單,相關代碼位於 frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp frameworks/base/services/java/com/android/server/AlarmManagerService.java 一.frameworks/base/core/jni/server/com_android_server_AlarmManagerService.cpp 這部分代碼直接管理硬件時鐘,設備名爲/dev/alarm。包括打開設備,關閉設備,設置時區, 設置觸發時間(timeout),以及等待時鐘觸發。 二.frameworks/base/services/java/com/android/server/AlarmManagerService.java 這部分封裝目錄一中的代碼,向上提供java接口,同時與客戶端(如calendar)交互,接 收來自客戶端的時鐘設置請求,並在時鐘觸發時通知客戶端。 Alarm是在預約的時間上觸發Intent的一種獨立的方法。 Alarm超出了應用程序的做用域,因此它們能夠用於觸發應用程序事件或動做,甚至在應用 程序關閉以後。與BroadcastReceiver結合,它們能夠變得尤爲的強大,能夠經過設置Alarm 來啓動應用程序或者執行動做,而應用程序不須要打開或者處於活躍狀態。 舉個例子,你可使用Alarm來實現一個鬧鐘程序,執行正常的網絡查詢,或者在「非高峯」 時間安排耗時或有代價的操做。 對於僅在應用程序生命週期內發生的定時操做,Handler類與Timer和Thread類的結合是 一個更好的選擇,它容許Android更好地控制系統資源。 Android中的Alarm在設備處於睡眠模式時仍保持活躍,它能夠設置來喚醒設備;然而,所 有的Alarm在設備重啓時都會被取消。 Alarm的操做經過AlarmManager來處理,經過getSystemService能夠得到其系統服務,如 下所示: AlarmManageralarms=(AlarmManager)getSystemService(Context.ALARM_SERVICE); 爲了建立一個新的Alarm,使用set方法並指定一個Alarm類型、觸發時間和在Alarm觸發 時要調用的Intent。若是你設定的Alarm發生在過去,那麼,它將當即觸發。 這裏有4種Alarm類型。你的選擇將決定你在set方法中傳遞的時間值表明什麼,是特定的 時間或者是時間流逝:  RTC_WAKEUP 在指定的時刻(設置Alarm的時候),喚醒設備來觸發Intent。  RTC 在一個顯式的時間觸發Intent,但不喚醒設備。  ELAPSED_REALTIME 從設備啓動後,若是流逝的時間達到總時間,那麼觸發Intent,但不喚醒設備。流逝的時 間包括設備睡眠的任什麼時候間。注意一點的是,時間流逝的計算點是自從它最後一次啓動算起。  ELAPSED_REALTIME_WAKEUP 從設備啓動後,達到流逝的總時間後,若是須要將喚醒設備並觸發Intent。 Alarm的建立過程演示以下片斷所示: intalarmType=AlarmManager.ELAPSED_REALTIME_WAKEUP; longtimeOrLengthofWait=10000; StringALARM_ACTION=「ALARM_ACTION」; IntentintentToFire=newIntent(ALARM_ACTION); PendingIntentpendingIntent=PendingIntent.getBroadcast(this,0,intentToFire, 0); alarms.set(alarmType,timeOrLengthofWait,pendingIntent); 當Alarm到達時,你指定的PendingIntent將被觸發。設置另一個Alarm並使用相同的 PendingIntent來替代以前存在的Alarm。 取消一個Alarm,調用AlarmManager的cancel方法,傳入你再也不但願被觸發的 PendingIntent,以下面的代碼所示: alarms.cancel(pendingIntent); 接下來的代碼片斷中,設置了兩個Alarm,隨後立刻取消了第一個Alarm。第一個Alarm顯 式地設置了在特定的時間喚醒設備併發送Intent。第二個設置爲從設備啓動後,流逝時間 爲30分鐘,到達時間後若是設備在睡眠狀態也不會喚醒它。 AlarmManageralarms=(AlarmManager)getSystemService(Context.ALARM_SERVICE); StringMY_RTC_ALARM=「MY_RTC_ALARM」; StringALARM_ACTION=「MY_ELAPSED_ALARM」; PendingIntentrtcIntent=PendingIntent.getBroadcast(this,0,new Intent(MY_RTC_ALARM),1); PendingIntentelapsedIntent=PendingIntent.getBroadcast(this,0,new Intent(ALARM_ACTION),1); //Wakeupandfireintentin5hours.(註釋可能有錯) Datet=newDate(); t.setTime(java.lang.System.currentTimeMillis()+60*1000*5); alarms.set(AlarmManager.RTC_WAKEUP,t.getTime(),rtcIntent); //Fireintentin30minsifalreadyawake. alarms.set(AlarmManager.ELAPSED_REALTIME,30*60*1000,elapsedIntent); //Cancelthefirstalarm. alarms.cancel(rtcIntent);
相關文章
相關標籤/搜索