AlarmManager 鬧鐘簡述
阿新 • • 發佈:2018-12-27
一 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;
}
}
}