一、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>