AlarmManager使用總結

2021-07-26 00:24:57 字數 2541 閱讀 7389

下面總結以下我在使用alarmmanager碰到的一些問題。

由於心跳是週期性任務,所以我想使用setrepeating方法來執行

void setrepeating (int type, long triggeratmillis, long intervalmillis,pendingintent operation)

這裡注意一下type引數,它有4種型別:

1.elapsed_realtime //根據手機reboot之後的時間(systemclock.elapsedrealtime() )執行alarm任務,若到了執行alarm任務的時間,但手機處於休眠狀態,那麼就不會執行alarm任務,直到喚醒手機

2.elapsed_realtime_wakeup //同上 不過會喚醒手機,立即執行alarm任務

3.rtc //同elapsed_realtime,不過是根據系統當前時間(system.currenttimemillis() )

4.rtc_wakeup //同elapsed_realtime_wakeup,會喚醒手機,立即執行alarm任務。

這就尷尬了,抱著試一試的心態,用了下這個方法。

intent intent = new intent(this, messagesocketservice.class);

intent.setaction(messagesocketservice.action_heart_beat);

pendingintent pendingintent = pendingintent.getservice(this, 0, intent, pendingintent.flag_cancel_current);

long starttime = systemclock.elapsedrealtime();

malarmmanager.setrepeating(alarmmanager.elapsed_realtime_wakeup, starttime + 10000, 10000, pendingintent);

設定的是每10s執行一次start messagesocketservice。

在api23手機上的執行結果如下:

在api15手機上的執行結果如下(手機問題把間隔調到了1s):

從執行結果上來看,在api23手機上,心跳時間間隔(單位:ms)完全跟傳入的引數不符,而且執行週期也不確定,相差很大,而在api15的手機上,執行任務的時間間隔幾乎等於設定的間隔時間。

最後,還是放棄了api自帶的這種定期執行任務的方法。同時,api文件中提示了如果想精確按週期執行任務,就要給每乙個任務設定執行時間,那麼只能在每次執行乙個任務之後,為下乙個任務設定執行時間。那麼每當該執行任務的時候,可以使用broadcast傳送乙個廣播,通知service傳送心跳請求。

這時候可以用到setexact(int type, long triggeratmillis, pendingintent operation) 和set(int type, long triggeratmillis, pendingintent operation)方法,其中setexact是api19之後才加入的,而set方法是在api19之前就可以使用,區別是呼叫set方法,是由系統決定什麼時候執行任務,而setexact則是讓系統盡量按照設定的triggeratmillis(發生時間)執行任務,setexact比set更加精確。

這裡最關鍵的第三步**:

@targetapi(value = build.version_codes.kitkat)

private void startheartbeatbroadcasttask() else

}

測試中發現,不同api版本對間隔時間有限制,我測出來的是api19及以下的版本,間隔時間不做限制,而大於api19的手機,間隔時間最小為5s。

測試結果如下:

實驗成功,不論是鎖屏狀態,還是手機執行時,都能保證在5s傳送一次心跳。

最後在service銷毀的時候,需要取消alarmmanager的任務,**如下

private

void

stopheartbeatbroadcast()

最最後,這裡稍微提一下,由於cpu被alarm喚醒執行任務只會有很短的時間,所以需要wakelock鎖來保證心跳的傳送(如果傳送失敗,需要重新建立socket連線,這個過程可能會很耗時),知道伺服器返回成功之後再釋放鎖,讓機器得以休眠,現在還沒開發到這一步,遇到這個問題時,會將wakelock相關的東西補上。

使用AlarmManager實現精確定時任務

最近實現了乙個小專案 定時執行任務。專案位址 坑 執行時間不准甚至不執行。各種查資料,無果 可能是搜商不夠 最終實現 將寫的應用加入手機的白名單或新增為保護程式 不同的手機有不同的叫法 允許程式鎖屏後能執行。實現思路 使用pendingintent.getbroadcast 實現到指定時間傳送廣播,...

AlarmManager延遲生效

alarmmanager這個類提供對系統鬧鐘服務的訪問介面。你可以為你的應用設定乙個在未來某個時間喚醒的功能。當鬧鐘響起,實際上是系統發出了為這個鬧鐘註冊的廣播,會自動開啟目標應用。註冊的鬧鐘在裝置睡眠的時候仍然會保留,可以選擇性地設定是否喚醒裝置,但是當裝置關機和重啟後,鬧鐘將會被清除。在alar...

AlarmManager 鬧鐘服務

alarmmanager簡介 在特定的時刻為我們廣播乙個指定的intent,簡單來說就是我們自己定乙個時間,然後到時間時,alarmmanager會為我們廣播乙個我們設定好的intent,比如指向某個activity或者service。獲得alarmmanager例項alarmmanager ala...