1. 程式人生 > >AlarmManager詳解:android中的定時任務

AlarmManager詳解:android中的定時任務

1.概述

AlarmManager通常用途是用來開發手機鬧鐘,但是AlarmManager的用處並只是這個。AlarmManager其實是一個全域性定時器,它可以在指定時間或指定週期啟動其他元件,在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設定一個時間,當到達這個時間,就會發出廣播提醒我們.

2.AlarmManager的常用方法有三個

  1. set(int type,long startTime,PendingIntent pi)
  2. setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
  3. 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 使用步驟

  1. 獲得AlarmManager例項
    ALarmManager manager=(ALarmManager)getSystemService(ALARM_SERVICE)
  2. 定義PendingIntent發出的廣播
  3. 呼叫AlarmManager方式設定定時或者重複提醒
  4. 取消提醒

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