AlarmManager, WakeLock and IntentService

    在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

相關文章
相關標籤/搜索