1. 程式人生 > >AlarmManager 鬧鐘簡述

AlarmManager 鬧鐘簡述

一 AlarmManager概述

AlarmManager是Android中常用的一種系統級別的提示服務,在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設定一個時間,然後在該時間到來時,AlarmManager為我們廣播一個我們設定的Intent,通常我們使用 PendingIntent,PendingIntent可以理解為Intent的封裝包,簡單的說就是在Intent上在加個指定的動作。在使用Intent的時候,我們還需要在執行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的話就是將這個動作包含在內了。

定義一個PendingIntent物件 : PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,0);

二 AlarmManager方法

AlarmManager有如下三種方式提供提示服務:

方法1 : set(int type,long triggerAtTime,PendingIntent operation)

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

方法2 : setRepeating(int type,long triggerAtTime,long interval PendingIntent operation)

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

方法3 : setInexactRepeating(int type,long triggerAtTime,long interval PendingIntent operation)

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

引數:

long startTime: 鬧鐘的第一次執行時間,以毫秒為單位,可以自定義時間,不過一般使用當前時間。需要注意的是,本屬性與第一個屬性(type)密切相關
	 
long intervalTime:對於後兩個方法來說,存在本屬性,表示兩次鬧鐘執行的間隔時間,也是以毫秒為單位。

PendingIntent pi: 綁定了鬧鐘的執行動作,比如傳送一個廣播、給出提示等等

三 AlarmManager使用

1 獲得ALarmManager例項 ALarmManager am=(ALarmManager)getSystemService(ALARM_SERVICE);
2 定義一個PendingIntent發出廣播
3 呼叫ALarmManager方法,設定定時或重複提醒
4 取消提醒:

實現6後秒提醒一次的功能:

 AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);//獲取AlarmManager例項 
 int anHour =  6 * 1000 ;  // 6秒 
 long triggerAtTime = SystemClock.elapsedRealtime() + anHour;  
 Intent intent2 = new Intent(this, AlarmReceiver.class); 
 PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent2, 0);  
 manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);//開啟提醒 

用於取消:

 aManager= (AlarmManager)getSystemService(ALARM_SERVICE);
 Intent intent = new Intent(AlarmTest.this, AlarmActivity.class); 
 intent.setAction("111111");
 PendingIntent pendingIntent = PendingIntent.getActivity( AlarmTest.this, 0, intent, 0); // 建立PendingIntent物件 
 aManager.cancel(pendingIntent);

Android定時關機示例

 public class xxxx extends BroadcastReceiver {
   
		private static String LAST_ALARM_TIME="08:00";
   
		//獲得ALarmManager例項
		AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
		
		String shutdown = null;//關機時間字串
		int[] AlarmOff = {2018,12,14,11,00}; //關機時間資料

		int mYear =  AlarmOff[0];
		int mMonth = AlarmOff[1];
		int mDay = AlarmOff[2];
		int mHour = AlarmOff[3];
		int mMinute = AlarmOff[4];
		
		//將關機時間轉換為字串
		StringBuilder date = new StringBuilder().append(mYear).append("/")
                .append((mMonth < 10) ? "0" + mMonth : mMonth) .append("/")
                .append((mDay < 10) ? "0" + mDay : mDay).append(" ")
                .append((mHour < 10) ? "0" + mHour : mHour).append(":")
                .append((mMinute < 10) ? "0" + mMinute : mMinute);
		
		shutdown = date.toString();
		
		
		//格式化關機時間 將關機時間字串 轉換為 yyyy/MM/dd HH:mm 格式的 英文日期時間格式
		Date date = null;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
		
		try {
            date = sdf.parse(shutdown);
        } catch (ParseException e) {
            e.printStackTrace();
        }
		long timeSetup = date.getTime();//獲取關機時間距離1970年1月1日(好像是這個時間)的毫秒數
		
        Intent intent = new Intent(context,xxxx.class);//xxxx.class 即定時時間到需要跳轉到的目標服務
        intent.setAction(shutdown);//設定想要啟動能夠響應設定的這個 action(關機時間) 的活動 ,其實就是到時間後 和這個關機時間作比較
		
		//將關機時間儲存到   AlarmShutdown.xml檔案中
		SharedPreferences pre = context.getSharedPreferences("AlarmShutdown", context.MODE_PRIVATE);
		SharedPreferences.Editor presEditor = pre.edit();
		presEditor.putString(LAST_ALARM_TIME,shutdown);
		presEditor.commit();
		
		//定義一個PendingIntent物件
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
		
		//設定鬧鐘 鬧鐘型別是RTC_WAKEUP,鬧鐘時間timeData ,鬧鐘響應動作是 pi
        aManager.set(AlarmManager.RTC_WAKEUP, timeSetup, pi);

		//鬧鐘時間來臨,對比 鬧鐘時間的動作“關機time” 是否等於寫入xml檔案中的關機時間。比較的是字串
	   if(action.equals(getLastAlarmTime(context))){
	   
			//關機
            Intent shutdownIntent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
            shutdownIntent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
            shutdownIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mcontext.startActivity(shutdownIntent);
	   }
   
		public static String getLastAlarmTime(Context context){
			SharedPreferences pre = context.getSharedPreferences("AlarmShutdown", context.MODE_PRIVATE);
			String ret = pre.getString(LAST_ALARM_TIME,"08:00");
			Log.e(TAG,"last time string is:" + ret);
				if(ret != null){
					return ret;
				}else{
					return null;
				}
			}
		
   }