Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android隨筆之——鬧鐘制作鋪墊之AlarmManager詳解

Android隨筆之——鬧鐘制作鋪墊之AlarmManager詳解

編輯:關於Android編程

一、AlarmManager簡介     對於一個鬧鐘應用的實現,個人覺得最主要的應該要屬於AlarmManager了。AlarmManager稱為全局定時器,字面意思就是鬧鐘管理(請原諒我蹩腳的英語),是Android中常用的一種系統級別的提示服務,在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設定一個時間,然後在該時間到來時,AlarmManager為我們廣播一個我們設定的Intent,通常我們使用 PendingIntent(這貨在調用系統發送短信的時候也有,找個時間溫習下Intent,順帶把這個也好好學習下),PendingIntent可以理解為Intent的封裝包,簡單的說就是在Intent上在加個指定的動作。在使用Intent的時候,我們還需要在執行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的話就是將這個動作包含在內了。   //定義一個PendingIntent對象,此處先照樣畫葫蘆,下次學了再細講 PendingIntent pi = PendingIntent.getBroadcast(Context, int, Intent, int); 二、AlarmManager常用方法簡介     AlarmManager類提供的常用方法主要有一下幾個:   復制代碼 public void set(int type, long triggerAtMillis, PendingIntent operation) 功能:用於設置一次性鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示觸發這個鬧鐘要等待的時間,與type相關(不懂英文就查字典吧,我也是查了才理解這個參數的意思的), 第三個參數鬧鐘響應的動作 參數:type:    AlarmManager.ELAPSED_REALTIME    表示鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間(相對於系統啟動開始),狀態值為3;             AlarmManager.ELAPSED_REALTIME_WAKEUP    表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間,狀態值為2;             AlarmManager.RTC  表示鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間,即當前系統時間,狀態值為1;             AlarmManager.RTC_WAKEUP  表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間,狀態值為0;             AlarmManager.POWER_OFF_WAKEUP  表示鬧鐘在手機關機狀態下也能正常進行提示功能,該狀態下鬧鐘也是用絕對時間,狀態值為4;不過我測試的時候並沒有        這個常量,估計和SDK有關     operation    綁定了鬧鐘的執行動作,比如發送一個廣播、給出提示等等。   public void setExact(int type, long triggerAtMillis, PendingIntent operation) 功能:在規定的時間精確的執行鬧鐘,這個函數應該是鬧鐘執行精度比較高吧   public void setRepeating(int type, long triggerAtMills, long intervalMillis, PendingIntent operation) 功能:該方法用於設置重復鬧鐘,第一個參數表示鬧鐘類型,第二個參數表示觸發這個鬧鐘要等待的時間,第三個參數表示鬧鐘兩次執行的間隔時間,第三個參數表示鬧鐘響應動作。   public void setInexactRepeating(int type, long triggerAtMills, long intervalMillis, PendingIntent operation) 功能:設置一個重復鬧鐘的不精確版本,它相對而言更節能一些,因為系統可能會將幾個差不多的鬧鐘合並為一個來執行,減少設備的喚醒次數。由於不是精確版,所以這裡的intervaMills 會略有不同 參數:intervalMillis:    INTERVAL_FIFTEEN_MINUTES                              INTERVAL_HALF_HOUR                          INTERVAL_HOUR                          INTERVAL_HALF_DAY                          INTERVAL_DAY    public void cancel(PendingIntent operation) 功能:取消一個設置的鬧鐘,移除任意匹配意圖的鬧鐘   public void setTimeZone(String timeZone)  功能:設置系統的默認時區。需要android.permission.SET_TIME_ZONE權限  復制代碼  三、一個簡單的鬧鐘的實例Demo     首先,我們現在AndroidManifest.xml中注冊一個廣播,如果不清楚可以去看我之前寫的博客Android隨筆之——Android廣播機制Broadcast詳解   復制代碼     <receiver android:name=".AlarmReceiver" ><!-- Reveiver名稱,如果是內部類靜態注冊廣播,請在內部類前加$ -->             <intent-filter>                 <action android:name="android.intent.action.ALARM_RECEIVER" /><!-- 廣播接收的Intent -->                   <category android:name="android.intent.category.DEFAULT" />             </intent-filter>         </receiver> 復制代碼   接著,我們就要編寫一個廣播接收器,用來接收鬧鐘的廣播事件,進行相關處理   復制代碼  1 package com.example.alarmmanager;  2   3 import android.content.BroadcastReceiver;  4 import android.content.Context;  5 import android.content.Intent;  6 import android.widget.Toast;  7   8 public class AlarmReceiver extends BroadcastReceiver{  9  10     @Override 11     public void onReceive(Context arg0, Intent arg1) { 12         //此處可以添加鬧鐘鈴聲 13         System.out.println("我是鬧鐘,我要叫醒你..."); 14         Toast.makeText(arg0, "我是鬧鐘,我要叫醒你...", Toast.LENGTH_SHORT).show();   15     } 16  17 } 復制代碼   最後,在MainActivity.java寫上具體的實現代碼   復制代碼  1 package com.example.alarmmanager;  2   3 import android.app.Activity;  4 import android.app.AlarmManager;  5 import android.app.PendingIntent;  6 import android.content.Intent;  7 import android.os.Bundle;  8 import android.view.View;  9 import android.view.View.OnClickListener; 10  11 public class MainActivity extends Activity implements OnClickListener { 12  13     private AlarmManager alarmManager; 14     private PendingIntent operation; 15  16     protected void onCreate(Bundle savedInstanceState) { 17         super.onCreate(savedInstanceState); 18         setContentView(R.layout.activity_main); 19  20         // 初始化按鈕,並綁定監聽事件 21         findViewById(R.id.clock).setOnClickListener(this); 22         findViewById(R.id.repeating_clock).setOnClickListener(this); 23         findViewById(R.id.cancel_clock).setOnClickListener(this); 24  25         // 獲取AlarmManager對象 26         alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 27  28         // 創建Intent對象,action為android.intent.action.ALARM_RECEIVER 29         Intent intent = new Intent("android.intent.action.ALARM_RECEIVER"); 30         operation = PendingIntent.getBroadcast(this, 0, intent, 0); 31     } 32  33     @Override 34     public void onClick(View v) { 35         switch (v.getId()) { 36         case R.id.clock:// 設置一次性鬧鐘 37             alarmManager.set(AlarmManager.RTC_WAKEUP, 10000, operation); 38             break; 39         case R.id.repeating_clock:// 設置重復鬧鐘 40             alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 5000, 10000, 41                     operation); 42             break; 43         case R.id.cancel_clock:// 取消鬧鐘 44             alarmManager.cancel(operation); 45             break; 46         default: 47             break; 48         } 49     } 50 } 復制代碼   activity_main.xml   復制代碼 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="vertical" >       <Button         android:id="@+id/clock"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:text="設置一次性鬧鐘" />       <Button         android:id="@+id/repeating_clock"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:text="設置重復鬧鐘" />       <Button         android:id="@+id/cancel_clock"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:text="取消鬧鐘" />   </LinearLayout>
  1. 上一頁:
  2. 下一頁: