在Android開發中,咱們常常會用到AlarmManager來作一些相似於Linux cron job的工做。咱們如下面的代碼爲例來講明整個流程: java
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(context, WakeUpDemoReceiver.class); i.setAction("WakeUpDemo"); PendingIntent pi = PendingIntent.getBroadcast(context, "WakeUpDemo", i, 0); am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 100000, pi);上面的代碼說明了AlarmManager在定時時間到了以後會廣播一個Intent出來。這個Intent將會被一個 BroadcastReceiver 的實現類來處理:
public class WakeUpDemoReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if ("WakeUpDemo".equals(action)) { WakeLockManager lock = WakeLockManager.getInstance(context); lock.acquire(); Intent demo = new Intent("DemoService"); eventIn.setClass(context, DemoIntentService.class); context.startService(demo); } } }這裏引入了WakeLockManager。當定時時間到了以後,Android系統會被AlarmManager喚醒,而後經過Intent傳遞到WakeUpDemoReceiver。這裏爲何要用WakeLock?緣由在於咱們在onReceive方法裏面啓動了一個DemoIntentService。咱們通常把一些耗時的工做放到了這個DemoIntentService裏面去執行。若是不在onReceive開始的時候加鎖,系統有可能在啓動DemoIntentService以前從新在進入睡眠狀態。
一旦咱們獲取了鎖,那麼CPU就會處於running的狀態,若是不盡快的釋放鎖,那麼對電源的消耗是很是大的。那麼咱們應該在什麼地方釋放那?在DemoIntentService裏面。 android
public class DemoIntentService extends IntentService { public DemoIntentService (String name) { super(name); } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { WakeLockManager lock = WakeLockManager.getInstance(this); lock.release(); super.onDestroy(); } @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); return (START_REDELIVER_INTENT); } @Override protected void onHandleIntent(Intent intent) { handleIntent(intent); } }當DemoIntentService處理完Intent事件以後就會調用onDestroy,這樣就保證了咱們本身的邏輯工做作完以後馬上釋放鎖。
WakeLockManager是一個簡單的WakeLock的包裝類。這裏就不在說明。 git
下面的幾個連接能夠幫助咱們從其餘的角度來理解上面所說的流程。 github
http://www.androidguys.com/2009/04/02/wake-up-with-the-alarm/ ide
http://stackoverflow.com/questions/7665713/whats-the-best-between-alarmmanager-and-handlerwakelock
ui
https://github.com/commonsguy/cw-advandroid/tree/master/SystemServices/Alarm this