Android之AlarmManager

lvxiangan發表於2019-01-03

雖然Timer、Handler.postDelayed、Thread.sleep方法也可以實現定時任務,但當系統處於休眠狀態時,這些定時任務所在程式會被暫停,甚至app被進行垃圾回收,這就意味定時任務將失效。AlarmManager可以幫忙解決這一問題。

AlarmManager(定時管理器)作用:定時喚醒系統(即使休眠狀態下)執行任務,相比上述方法,更加節省電池耗電量。

先來一個demo,學習AlarmManager的用法:
1、新建一個DaemonService類:

// 獲取系統提供的AlarmManager物件
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);


PendingIntent pendingIntent = PendingIntent.getBroadcast(
    this,                                 // context:上下文
    0,                                    // requestCode:intent請求標記
    new Intent("COM.TEST.NOTIFY_ACTION"), // intent:需要廣播出去的intent
    PendingIntent.FLAG_UPDATE_CURRENT // flag:intent的控制標籤。update_current:新intent覆蓋更新舊的未處理的intent;       
);



// 設定3分鐘重複一次
alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 3000, pendingIntent);

 

2、在MainActivity註冊一下BroadcastReceiver

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // 註冊一個接收器,專門處理定時任務發過來的intent
    alarmReceiver = new AlarmReceiver();
    filter = new IntentFilter();
    filter.addAction("COM.TEST.NOTIFY_ACTION");
    registerReceiver(alarmReceiver, filter);

    startService(new Intent(this, DaemonService.class));
 }

 

3、自定義類:AlarmReceiver,處理廣播

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            // 寫上定時任務內容 TODO

        } catch (Exception e) {}
    }
}

 

step 1 介面引數詳解:

  • int type
    AlarmManager.RTC_WAKEUP:值為0,表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間(即當前系統時間)
    AlarmManager.RTC:值為1,表示鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間
    AlarmManager.ELAPSED_REALTIME_WAKEUP:值為2,表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間(相對於系統啟動開始)
    AlarmManager.ELAPSED_REALTIME:值為3,表示鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間。
    AlarmManager.POWER_OFF_WAKEUP:值為4,表示鬧鐘在手機關機狀態下也能正常進行提示功能,用得最多的狀態之一,該狀態下鬧鐘也是用絕對時間;不過本狀態好像受SDK版本影響,某些版本並不支援
  • ps:1、RTC = Real Time Clock 當前系統的實時時鐘
            2、RTC鬧鐘和ELAPSED_REALTIME 最大的差別就是前者可以通過修改手機時間觸發鬧鐘事件,
    後者要通過真實時間的流逝,即使在休眠狀態,時間也會被計算。
     

  • long triggerAtMillis : 鬧鐘第一次執行時間,毫秒為單位,需與第一個type引數匹配,
    1. 如果是RTC型別,triggerAtMillis 則一般使用System.currentTimeMillis();
    2. 如果是ELAPSED型別,triggerAtMillis 則一般使用SystemClock.elapsedRealtime();
  • long intervalMillis : 兩次鬧鐘執行間隔
  • PendingIntent operation : 任務的執行動作,傳送廣播,啟動activity,啟動service

 



參考:
https://www.jianshu.com/p/32f438a0c239
https://blog.csdn.net/wei_chong_chong/article/details/51258336 

 

 

相關文章