public class LongRunningService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
Log.d("LongRunningService", "executed at " + new Date().
toString());
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
int anHour = 60 * 60 * 1000; // 這是一小時(shí)的毫秒數(shù)
long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
Intent i = new Intent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
//說(shuō)明:set()方法需要傳入三個(gè)參數(shù)
第一個(gè)是整型參數(shù)崇败,用于指定AlarmManager的工作類(lèi)型肩祥,有四種值可選缩膝,分別是ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP将饺、RTC 和 RTC_WAKEUP。其中 ELAPSED_REALTIME 表示讓定時(shí)任務(wù)的觸發(fā)時(shí)間從系統(tǒng)開(kāi)機(jī)開(kāi)始算起予弧,但不會(huì)喚醒 CPU湖饱。ELAPSED_REALTIME_WAKEUP 表示會(huì)喚醒 CPU掖蛤。RTC 表示從 1970 年 1月 1 日 0 點(diǎn)開(kāi)始算起井厌,不喚醒CPU。RTC_WAKEUP 表示會(huì)喚醒 CPU彪置。使用 SystemClock.elapsedRealtime()方法可以獲取到系統(tǒng)開(kāi)機(jī)至今所經(jīng)歷時(shí)間的毫秒數(shù),使用 System.currentTimeMillis()方法可以獲取到 1970 年 1 月 1 日 0 點(diǎn)至今所經(jīng)歷時(shí)間的毫秒數(shù)。
第二個(gè)參數(shù)是定時(shí)任務(wù)觸發(fā)時(shí)間惶桐。與第一個(gè)參數(shù)相關(guān)撮弧。如果是開(kāi)機(jī)時(shí)間姚糊,則獲取開(kāi)始時(shí)間再加上延遲時(shí)間,其他同理救恨。
第三個(gè)參數(shù)是PendingIntent。
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
return super.onStartCommand(intent, flags, startId);
}
}
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, LongRunningService.class);
context.startService(i);
}
}