(一)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)。
- public static final int ELAPSED_REALTIME
第二個引數表示鬧鐘執行時間。
第三個引數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)方法。如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。
- 設定週期性執行的鬧鐘:
/** 設定一個重複性鬧鐘*/
alarmManager.setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
設定一個週期性執行的定時服務。第一個引數表示鬧鐘型別,第二個引數表示鬧鐘首次執行時間,第三個引數表示鬧鐘兩次執行的間隔時間,第三個引數表示鬧鐘響應動作。
- 第三種 設定不定週期重複鬧鐘:
/** 設定一個重複性鬧鐘*/
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: 設定鬧鐘,間隔一個小時
- 取消鬧鐘的方式:
“` python
alarmManager.cancel(pendingIntent);
cancel(PendingIntent operation)方法將會取消Intent匹配的任何鬧鐘。只比較Intent的action,data,type,class,categories,其他的資料都不在比較範圍之內。
## PendingIntent
PendingIntent的使用方式如下,程式碼做詳細註釋,此處不做贅述:
``` python
alarmManager.cancel(pendingIntent);