一、AlarmManager介紹
AlarmManager提供了對(duì)系統(tǒng)定時(shí)服務(wù)的訪問接口,使得開發(fā)者可以安排在未來的某個(gè)時(shí)間運(yùn)行應(yīng)用。當(dāng)?shù)竭_(dá)鬧鈴設(shè)定時(shí)間,系統(tǒng)就會(huì)廣播鬧鈴之前注冊(cè)的Intent。如果此時(shí)目標(biāo)應(yīng)用沒有被啟動(dòng),系統(tǒng)還會(huì)幫你自動(dòng)啟動(dòng)目標(biāo)應(yīng)用。即使設(shè)備已經(jīng)進(jìn)入睡眠已注冊(cè)的鬧鈴也會(huì)被保持,只有當(dāng)設(shè)備關(guān)閉或是重啟的時(shí)候會(huì)被清除。
二、AlarmManager用法
/**
* 每天早上8:30開啟提醒
*/
public void startRemind(){
//得到日歷實(shí)例,主要是為了下面的獲取時(shí)間
mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(System.currentTimeMillis());
//獲取當(dāng)前毫秒值
long systemTime = System.currentTimeMillis();
//是設(shè)置日歷的時(shí)間,主要是讓日歷的年月日和當(dāng)前同步
mCalendar.setTimeInMillis(System.currentTimeMillis());
// 這里時(shí)區(qū)需要設(shè)置一下,不然可能個(gè)別手機(jī)會(huì)有8個(gè)小時(shí)的時(shí)間差
mCalendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
//設(shè)置在幾點(diǎn)提醒 設(shè)置的為8點(diǎn)
mCalendar.set(Calendar.HOUR_OF_DAY, 8);
//設(shè)置在幾分提醒 設(shè)置的為30分
mCalendar.set(Calendar.MINUTE, 30);
//下面這兩個(gè)看字面意思也知道
mCalendar.set(Calendar.SECOND, 0);
mCalendar.set(Calendar.MILLISECOND, 0);
//上面設(shè)置的就是8點(diǎn)30分的時(shí)間點(diǎn)
//獲取上面設(shè)置的13點(diǎn)25分的毫秒值
long selectTime = mCalendar.getTimeInMillis();
// 如果當(dāng)前時(shí)間大于設(shè)置的時(shí)間,那么就從第二天的設(shè)定時(shí)間開始
if(systemTime > selectTime) {
mCalendar.add(Calendar.DAY_OF_MONTH, 1);
}
//AlarmReceiver.class為廣播接受者
Intent intent = new Intent(getActivity(), AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(getActivity(), 0, intent, 0);
//得到AlarmManager實(shí)例
AlarmManager am = (AlarmManager)getContext().getSystemService(ALARM_SERVICE);
//**********注意??!下面的兩個(gè)根據(jù)實(shí)際需求任選其一即可*********
/**
* 單次提醒
* mCalendar.getTimeInMillis() 上面設(shè)置的13點(diǎn)25分的時(shí)間點(diǎn)毫秒值
*/
am.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pi);
// /**
// * 重復(fù)提醒
// * 第一個(gè)參數(shù)是警報(bào)類型;下面有介紹
// * 第二個(gè)參數(shù)網(wǎng)上說法不一,很多都是說的是延遲多少毫秒執(zhí)行這個(gè)鬧鐘,但是我用的刷了MIUI的三星手機(jī)的實(shí)際效果是與單次提醒的參數(shù)一樣,即設(shè)置的13點(diǎn)25分的時(shí)間點(diǎn)毫秒值
// * 第三個(gè)參數(shù)是重復(fù)周期,也就是下次提醒的間隔 毫秒值 我這里是一天后提醒
// */
// am.setRepeating(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), (1000 * 60 * 60 * 24), pi);
}
三、定時(shí)器--定時(shí)做某事
通過Timer.schedule來調(diào)度TimerTask里面聲明的任務(wù)
public void updateKnowledge() {
Timer timer=new Timer;
timer.schedule(new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_DRINK_KNOWLEDGE;
handler.sendMessage(message);
}//每隔10秒使用handler發(fā)送一下消息,也就是每隔10秒執(zhí)行一次,一直重復(fù)執(zhí)行
}, 0, TimeConstant.ONE_SEC * 10);
}