android學習筆記--AlarmManager

wangyy發表於2014-06-24

AlarmManager稱呼為全域性定時器,有的稱呼為鬧鐘。其實它的作用和Timer有點相似。

都有兩種相似的用法:

(1)在指定時長後執行某項操作(2)週期性的執行某項操作

AlarmManager 包含的主要方法:

// 取消已經註冊的與引數匹配的定時器
void cancel(PendingIntent operation)
//註冊一個新的延遲定時器
void set(int type, long triggerAtTime, PendingIntent operation)
//註冊一個重複型別的定時器
void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
//註冊一個非精密的重複型別定時器
void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
//設定時區
void setTimeZone(String timeZone)

AlarmManager物件配合Intent使用,可以定時的開啟一個Activity,傳送一個BroadCast,或者開啟一個Service.

android提供了的幾種型別的鬧鐘: 

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)。

 見api/app/alarm/AlarmController例項

demo:

AlarmManager mgr = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);

Intent i = new Intent(context, MyAlarmService.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pi = PendingIntent.getService(context, 0, i, 0);

 

//設定觸發時間

GregorianCalendar now = new GregorianCalendar();
GregorianCalendar targetTime = new GregorianCalendar();

targetTime.set(GregorianCalendar.HOUR_OF_DAY, 2);
targetTime.set(GregorianCalendar.MINUTE, 0);

long diff = targetTime.getTimeInMillis() - now.getTimeInMillis();

if (diff < 0) // passerat 2am
diff += AlarmManager.INTERVAL_DAY;

//註冊一個重複型別的定時器
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + diff,
AlarmManager.INTERVAL_DAY, pi);

 

 

 

 

 

相關文章