1. 程式人生 > >(一)AlarmManager使用與原理

(一)AlarmManager使用與原理

鬧鐘原理

當鬧鐘響起,實際上是系統發出了為這個鬧鐘註冊的廣播,會自動開啟目標應用。
註冊的鬧鐘在裝置睡眠的時候仍然會保留,可以選擇性地設定是否喚醒裝置,但是當裝置關機和重啟後,鬧鐘將會被清除。

主要程式碼介紹

一個鬧鐘的程式碼編輯,核心使用到的類有三個
1.Calendar(計算鬧鐘需要響起的時間),
2.AlarmManager(設定/取消鬧鐘的管理類),
3.PendingIntent(鬧鐘的觸發事件)

AlarmClockInfo

需要使用到的實體類,可自己定義:


public class AlarmClockInfo {
    int id;//鬧鐘的唯一標示,用來區分不一樣的鬧鐘
    long
dataTime;// 鬧鐘定時的時間 int modle;// 鬧鐘的模式 採用777模式編寫 0表示只響一次/1表示每週禮拜1 boolean isOpen; // true表示 開啟 / flalse表示關閉 String musicName;//對應的音樂名稱 (個人鬧鐘不同,可自由定製) public int getId() { return id; } public void setId(int id) { this.id = id; } public long getDataTime() { return
dataTime; } public void setDataTime(long dataTime) { this.dataTime = dataTime; } public int getModle() { return modle; } public void setModle(int modle) { this.modle = modle; } public boolean isOpen() { return isOpen; } public void
setOpen(boolean isOpen) { this.isOpen = isOpen; } public String getMusicName() { return musicName; } public void setMusicName(String musicName) { this.musicName = musicName; } }

AlarmManager

AlarmManager物件可以通過獲取Context.ALARM_SERVICE系統服務來獲得:

    /** 獲取系統鬧鐘管理服務物件*/
    AlarmManager alarmManager= ((AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE));

AlarmManager的常用方法有三個:
1. 第一種 設定一個一次性鬧鐘:

    /** 設定一個一次性鬧鐘*/
    alarmManager.set(int type,long startTime,PendingIntent pi);
  • 第一個引數int type指定定時服務的型別,該引數接受如下值:

    • public static final int ELAPSED_REALTIME
      // 當系統進入睡眠狀態時,這種型別的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是相對時間,是從系統啟動後開始計時的,包括睡眠時 間,可以通過呼叫SystemClock.elapsedRealtime()獲得。系統值是3 (0x00000003)。
    • public static final int ELAPSED_REALTIME_WAKEUP
      //能喚醒系統,用法同ELAPSED_REALTIME,系統值是2 (0x00000002) 。
    • public static final int RTC
      //當系統進入睡眠狀態時,這種型別的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是絕對時間,所用時間是UTC時間,可以通過呼叫 System.currentTimeMillis()獲得。系統值是1 (0x00000001) 。

    • public static final int RTC_WAKEUP
      //能喚醒系統,用法同RTC型別,系統值為 0 (0x00000000) 。

    • Public static final int POWER_OFF_WAKEUP
      //能喚醒系統,它是一種關機鬧鈴,就是說裝置在關機狀態下也可以喚醒系統,所以我們把它稱之為關機鬧鈴。使用方法同RTC型別,系統值為4(0x00000004)。

  • 第二個引數表示鬧鐘執行時間。

  • 第三個引數PendingIntent pi表示鬧鐘響應動作:

PendingIntent pi:是鬧鐘的執行動作,比如傳送一個廣播、給出提示等等。PendingIntent是Intent的封裝類。需要注意的是,如果是通過啟動服務來實現鬧鐘提示的話,PendingIntent物件的獲取就應該採用Pending.getService(Context c,int i,Intentintent,int j)方法;如果是通過廣播來實現鬧鐘提示的話,PendingIntent物件的獲取就應該採用PendingIntent.getBroadcast(Context c,inti,Intent intent,int j)方法;如果是採用Activity的方式來實現鬧鐘提示的話,PendingIntent物件的獲取就應該採用PendingIntent.getActivity(Context c,inti,Intent intent,int j)方法。如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。

  1. 設定週期性執行的鬧鐘:
    /** 設定一個重複性鬧鐘*/
    alarmManager.setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
  • 設定一個週期性執行的定時服務。第一個引數表示鬧鐘型別,第二個引數表示鬧鐘首次執行時間,第三個引數表示鬧鐘兩次執行的間隔時間,第三個引數表示鬧鐘響應動作。

    1. 第三種 設定不定週期重複鬧鐘:
    /** 設定一個重複性鬧鐘*/
    alarmManager.setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

該方法也用於設定重複鬧鐘,與第二個方法相似,不過其兩個鬧鐘執行的間隔時間不是固定的而已。它相對而言更省電(power-efficient)一些,因為系統可能會將幾個差不多的鬧鐘合併為一個來執行,減少裝置的喚醒次數。第三個引數intervalTime為鬧鐘間隔,內建的幾個變數如下:
INTERVAL_DAY: 設定鬧鐘,間隔一天
INTERVAL_HALF_DAY: 設定鬧鐘,間隔半天
INTERVAL_FIFTEEN_MINUTES:設定鬧鐘,間隔15分鐘
INTERVAL_HALF_HOUR: 設定鬧鐘,間隔半個小時
INTERVAL_HOUR: 設定鬧鐘,間隔一個小時

  1. 取消鬧鐘的方式:
    “` python
    alarmManager.cancel(pendingIntent);
cancel(PendingIntent operation)方法將會取消Intent匹配的任何鬧鐘。只比較Intent的action,data,type,class,categories,其他的資料都不在比較範圍之內。

## PendingIntent
PendingIntent的使用方式如下,程式碼做詳細註釋,此處不做贅述:
``` python
alarmManager.cancel(pendingIntent);