AlarmManager安卓鬧鐘

AlarmManager介紹

AlarmManager是一種系統級別的提示服務,可以實現從指定時間開始,以一個固定的間隔時間執行某項操作,所以常常與廣播(Broadcast)連用,實現鬧鐘等提示功能。

AlarmManager的常用方法

set(int type,long startTime,PendingIntent pi);

該方法用於設置一次性鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示鬧鐘執行時間,第三個參數表示鬧鐘響應動作。

setRepeating(int type,long startTime,long intervalTime,PendingIntent operation);【精準的重複】

該方法用於設置重複鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示鬧鐘首次執行時間,第三個參數表示鬧鐘兩次執行的間隔時間,第三個參數表示鬧鐘響應動作。

setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent operation);【模糊的的重複】

該方法也用於設置重複鬧鐘,與第二個方法相似,不過其兩個鬧鐘執行的間隔時間不是固定的而已。

cancel(PendingIntent operation)

該方法用戶端是調用AlarmManager對象的cancel()函數來取消alarm的。

注意:setRepeating是精準的重複時間,而setInexactRepeating是大概的重複時間,一般情況下使用setInexactRepeating,因爲可以省電。
這是一些常用的方法,裏面的屬性在文章最後,大家可以一一去對照觀看

帶你使用,帶你飛

AlarmManager對象,注意這裏並不是new一個對象,Alarmmanager爲系統級服務

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 

然後我們還需要一個pandingintent對象

Intent intent = new Intent("ALARM_CLOCK");  
//定義一個PendingIntent對象,PendingIntent.getBroadcast包含了sendBroadcast的動作。  
//也就是發送了action 爲"ALARM_CLOCK"的intent   
PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,0);    

好接下來就是幹:

//設置鬧鐘從當前時間開始,每隔1min執行一次PendingIntent對象pi,注意第一個參數與第二個參數的關係  
//1min後通過PendingIntent pi對象發送廣播  
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),60*1000,pi);  

我們發送了廣播,當然我們就需要一個接收的廣播,所以我們定義一個廣播接受者:
首先在manifest裏面註冊

<receiver android:name=".MyAlarmReceiver ">  
        <intent-filter>  
            <action android:name="ALARM_CLOCK" />  
        </intent-filter>  
</receiver>  

然後我們就可以接收到廣播了

public class MyAlarmReceiver extends BroadcastReceiver  
{  

    @Override  
    public void onReceive(Context context, Intent intent)  
    {  
        // TODO Auto-generated method stub  
        //在這裏執行你需要的定時任務
        Toast.makeText(context,"我是定時任務",Toast.LENGTH_SHORT).show();  
    }  

}  

碰到的問題

1.關機alarm問題,如果關機後開機,那先前設置的鬧鐘或者先前設置的alarm(不是指鬧鐘這個應用,是指定時任務)你認爲還有效麼?why?

關機之後設置的定時任務還在,但是pendingintent並沒有保存起來。所以無法執行任務。

解決方案:需要監聽ACTION_BOOT_COMPLETED廣播,並且重新設置alarm

2.Android5.1之後的規定AlarmManager時間間隔不得小於60秒

API21,在設置了AlarmManager時間少於60秒後,按照60秒計算
解決方案:少於60秒的計劃任務,請使用Timer

AlarmManager對象有多少個?

只有一個對象。 alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
如果再去拿就會崩掉

在最後附上一些上文沒提到的一些東西

int type(alarm類型)

RTC_WAKEUP
  表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間。

RTC
  表示鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間,即當前系統時間。

ELAPSED_REALTIME_WAKEUP
  表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間

ELAPSED_REALTIME
  表示鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間(相對於系統啓動開始)

POWER_OFF_WAKEUP【Android4.0之後沒有了】
  表示鬧鐘在手機關機狀態下也能正常進行提示功能,所以是5個狀態中用的最多的狀態之一,該狀態下鬧鐘也是用絕對時間

RTC和ELAPSED_REALTIME的區別

 RTC表示的是絕對時間,而ELAPSED_REALTIME表示的是時間流,RTC可以通過修改手機時間觸發鬧鐘事件,而ELAPSED_REALTIME必須通過真實時間的流逝,即使在休眠狀態,時間也會被計算。

long startTime(設置第一次執行時間)

鬧鐘的第一次執行時間,以毫秒爲單位,可以自定義時間,不過一般使用當前時間。需要注意的是,本屬性與第一個屬性(type)密切相關,如果第一個參數對應的鬧鐘使用的是相對時間(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那麼本屬性就得使用相對時間(相對於系統啓動時間來說),比如當前時間就表示爲:SystemClock.elapsedRealtime();如果第一個參數對應的鬧鐘使用的是絕對時間(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那麼本屬性就得使用絕對時間,比如當前時間就表示 爲:System.currentTimeMillis()

long intervalTime(時間間隔)

對於後兩個方法來說,存在本屬性,表示兩次鬧鐘執行的間隔時間,也是以毫秒爲單位。

PendingIntent operation

綁定了鬧鐘的執行動作,也就是pandingintent對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章