AlarmManager詳解:android中的定時任務
阿新 • • 發佈:2018-12-23
1.概述
AlarmManager通常用途是用來開發手機鬧鐘,但是AlarmManager的用處並只是這個。AlarmManager其實是一個全域性定時器,它可以在指定時間或指定週期啟動其他元件,在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設定一個時間,當到達這個時間,就會發出廣播提醒我們.
2.AlarmManager的常用方法有三個
- set(int type,long startTime,PendingIntent pi)
- setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
- setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
下面我們講一下這三個方法的用途
2.1首先了解一下 type
我們去看原始碼發現type就分為四種
AlarmManager.ELAPSED_REALTIME
狀態值為3,
在指定的延時過後,傳送廣播,但不喚醒裝置(鬧鐘在睡眠狀態下不可用)。如果在系統休眠時鬧鐘觸發,不會啟用裝置執行事件。AlarmManager.ELAPSED_REALTIME_WAKEUP
狀態值為2,
顧名思義,在指定的延時過後,傳送廣播,如果裝置休眠就會喚醒裝置,發出廣播執行事件AlarmManager.RTC
狀態值為1,
該狀態下鬧鐘使用絕對時間,也就是指定當系統呼叫System.currentTimeMillis()方法返回的值與triggerAtTime相等時啟動operation所對應的裝置(在指定的時刻,傳送廣播,但不喚醒裝置)。如果在系統休眠時鬧鐘觸發,它將不會被傳遞,直到下一次裝置喚醒(鬧鐘在睡眠狀態下不可用)。- AlarmManager.RTC_WAKEUP
狀態值為0
鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間,,也就是指定當系統呼叫System.currentTimeMillis()方法返回的值與triggerAtTime相等時啟動operation所對應的裝置 - AlarmManager.POWER_OFF_WAKEUP
狀態值為4
表示鬧鐘在手機關機狀態下也能正常進行提示功能,
2.2set(int type,long startTime,PendingIntent pi)設定一次性鬧鐘
也就是鬧鐘只執行一次,當執行完之後,不會再次執行
- 引數1 type: 就是上面的type
- 引數2 startTime 鬧鐘執行的時間
- 引數3 pi 執行的事件
2.3 setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)週期性執行的定時服務
- 引數1 type: 就是上面的type
- 引數2 startTime 鬧鐘執行的時間
- 引數3 intervalTime 間隔時間 詳情請看 2.3.1
- 引數4 pi 執行的事件
2.3.1 intervalTime的解釋
AlarmManager.INTERVAL_FIFTEEN_MINUTES 間隔15分鐘
AlarmManager.INTERVAL_HALF_HOUR 間隔半個小時
AlarmManager.INTERVAL_HOUR 間隔一個小時
AlarmManager.INTERVAL_HALF_DAY 間隔半天
AlarmManager.INTERVAL_DAY 間隔一天
2.4setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi)此方法跟2.3基本上相似,只不過這個方法優化了很多,省電
3 使用步驟
- 獲得AlarmManager例項
ALarmManager manager=(ALarmManager)getSystemService(ALARM_SERVICE) - 定義PendingIntent發出的廣播
- 呼叫AlarmManager方式設定定時或者重複提醒
- 取消提醒
3.1 定義的PendingIntent
Intent intent = new Intent(AlarmTest.this,
AlarmActivity.class);
//AlarmActivity就是當鬧鐘提醒的時候開啟的activity,你也可以傳送廣播
intent.setAction("nzy");
// 建立PendingIntent物件
PendingIntent pi = PendingIntent.getActivity(
AlarmTest.this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
// 根據使用者選擇時間來設定Calendar物件
calendar.set(Calendar.HOUR, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
// 設定AlarmManager將在Calendar對應的時間啟動指定元件
aManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pi);
3.2 取消鬧鐘
Intent intent = new Intent(AlarmTest.this, AlarmActivity.class); intent.setAction("nzy");
//這裡的action必須和上面設定的action一樣 也就是取消的唯一標識
PendingIntent pendingIntent = PendingIntent.getActivity( AlarmTest.this, 0, intent, 0); // 建立PendingIntent物件
aManager.cancel(pendingIntent);