Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> Android鬧鐘 AlarmManager的使用

Android鬧鐘 AlarmManager的使用

編輯:Android編程入門

AlarmManager介紹

  AlarmManager這個類提供對系統鬧鐘服務的訪問接口。

  你可以為你的應用設定一個在未來某個時間喚醒的功能。

  當鬧鐘響起,實際上是系統發出了為這個鬧鐘注冊的廣播,會自動開啟目標應用。

  注冊的鬧鐘在設備睡眠的時候仍然會保留,可以選擇性地設置是否喚醒設備,但是當設備關機和重啟後,鬧鐘將會被清除

 

  在alarm的receiver的onReceive()方法被執行的時候,Alarm Manager持有一個CPU喚醒鎖,這樣就保證了設備在處理完廣播之前不會sleep。

  一旦onReceive()方法返回,Alarm Manager就會釋放這個鎖,表明一些情況下可能onReceive()方法一執行完設備就會sleep。

  如果你的alarm receiver中調用了Context.startService(),那麼很可能service還沒起來設備就sleep了。

  為了阻止這種情況,你的BroadcastReceiver和Service需要實現不同的喚醒鎖機制,來確保設備持續運行到service可用為止。

 

  注意:Alarm Manager主要是用來在特定時刻運行你的代碼,即便是你的應用在那個特定時刻沒有跑的情況。

  對於常規的計時操作(ticks, timeouts, etc),使用Handler處理更加方便和有效率。

 

  另:從API 19開始,alarm的機制都是非准確傳遞,操作系統將會轉換鬧鐘,來最小化喚醒和電池使用。

  有一些新的API會支持嚴格准確的傳遞,見 Context.getSystemService(Context.ALARM_SERVICE)。

 

  相關方法說明:

  cancel(PendingIntent operation)方法將會取消Intent匹配的任何鬧鐘。

  關於Intent的匹配,查看filterEquals(Intent other)方法的說明可知,兩個Intent從intent resolution(filtering)(Intent決議或過濾)的角度來看是一致的,即認為兩個Intent相等。即是說,Intent的action,data,type,class,categories是相同的,其他的數據都不在比較范圍之內。

 

  PendingIntent operation)方法將會設置一個鬧鐘。

  注意:對於計時操作,可能使用Handler更加有效率和簡單。

  設置鬧鐘的時候注意:

  1.如果聲明的triggerAtMillis是一個過去的時間,鬧鐘將會立即被觸發。

  2.如果已經有一個相同intent的鬧鐘被設置過了,那麼前一個鬧鐘將會取消,被新設置的鬧鐘所代替。

 

  注意這裡說的intent相同指的都是Intent在 filterEquals(Intent)的定義下匹配。

  鬧鐘是一個廣播,接收器需要自己定義和注冊,注冊使用動態注冊( PendingIntent operation)方法將會設置一個重復性的鬧鐘。

  比set方法多了一個間隔參數。

 

  type的類型是四種:

  ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUP.

  區分的是時間標准和是否在睡眠狀態下喚醒設備。

  具體查看官方文檔吧不再詳細解釋啦。

 

實例

  比如要設置一個每晚21:30喚醒的重復鬧鐘:

    private static final int INTERVAL = 1000 * 60 * 60 * 24;// 24h

//...


        Intent intent = new Intent(context, RequestAlarmReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context,
                REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        // Schedule the alarm!
        AlarmManager am = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 21);
        calendar.set(Calendar.MINUTE, 30);
        calendar.set(Calendar.SECOND, 10);
        calendar.set(Calendar.MILLISECOND, 0);

        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                INTERVAL, sender);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved