AlarmManager的使用

 

AlarmManager的使用

 

AlarmManager的作用文檔中的解釋是:在特定的時刻爲我們廣播一個指定的Intent。簡單的說就是我們設定一個時間,然後在該時間到來時,AlarmManager爲我們廣播一個我們設定的Intent。

對應AlarmManager更深層的瞭解可以參考:
http://www.programbbs.com/doc/5888.htm
http://jinguo.iteye.com/blog/799778

android提供了四種類型的鬧鐘:
❑ ELAPSED_REALTIME
在指定的延時過後,發送廣播,但不喚醒設備。

❑ ELAPSED_REALTIME_WAKEUP
在指定的演示後,發送廣播,並喚醒設備
延時是要把系統啓動的時間SystemClock.elapsedRealtime()算進去的,具體用法看代碼。

❑ RTC
在指定的時刻,發送廣播,但不喚醒設備

❑ RTC_WAKEUP
在指定的時刻,發送廣播,並喚醒設備


AlarmManager提供的方法:
❑ void set(int type, long triggerAtTime, PendingIntent operation)
設置一個鬧鐘

❑ void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
設置一個會重複的鬧鐘

❑ void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
設置一個重複鬧鐘的不精確版本,它相對而言更節能(power-efficient)一些,因爲系統可能會將幾個差不多的鬧鐘合併爲一個來執行,減少設備的喚醒次數。
內置的幾個interval爲:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
如果你將其設爲DAY,那麼可能這一天中的所有鬧鐘都會被合併掉。

❑ void cancel(PendingIntent operation)
取消一個設置的鬧鐘

❑ void setTimeZone(String timeZone)
設置系統的默認時區。需要android.permission.SET_TIME_ZONE權限


Java代碼 複製代碼 收藏代碼
  1. // 首先創建Receiver
  2. public class AlarmReceiver extends BroadcastReceiver {
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. Toast.makeText(context, "alarm", Toast.LENGTH_SHORT).show();
  6. }
  7. }
// 首先創建Receiver
public class AlarmReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context, "alarm", Toast.LENGTH_SHORT).show();
	}
}


 

Xml代碼 複製代碼 收藏代碼
  1. // manifest中申明,並不需要intent-filter,我們是明確指定發到哪個receiver的
  2. <receiver android:name="yuan.receivers.AlarmReceiver" />
// manifest中申明,並不需要intent-filter,我們是明確指定發到哪個receiver的
<receiver android:name="yuan.receivers.AlarmReceiver" />


PendingIntent:簡單的說就是在Intent上在加個指定的動作。Intent的話,我們還需要在執行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的話就是將這個動作包含在內了,如PendingIntent.getBroadcast就包含了sendBroadcast的動作。

5s後發送指定廣播

Java代碼 複製代碼 收藏代碼
  1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
  3. int requestCode = 0;
  4. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
  5. requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  6. // 5秒後發送廣播,只發送一次
  7. int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
  8. alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
int requestCode = 0;
PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
		requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 5秒後發送廣播,只發送一次
int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent);


5s後發送指定廣播,然後每個10秒重複發送廣播

Java代碼 複製代碼 收藏代碼
  1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
  3. int requestCode = 0;
  4. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
  5. requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  6. // 5秒後發送廣播,然後每個10秒重複發廣播。廣播都是直接發到AlarmReceiver的
  7. int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
  8. int interval = 10 * 1000;
  9. alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, interval, pendIntent);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
int requestCode = 0;
PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
		requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 5秒後發送廣播,然後每個10秒重複發廣播。廣播都是直接發到AlarmReceiver的
int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
int interval = 10 * 1000;
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, interval, pendIntent);


取消一個鬧鐘

Java代碼 複製代碼 收藏代碼
  1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
  3. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
  4. 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  5. // 與上面的intent匹配(filterEquals(intent))的鬧鐘會被取消
  6. alarmMgr.cancel(pendIntent);

 

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