安卓執行後台工作的元件之優劣比較

2021-08-27 18:09:06 字數 2351 閱讀 9290

1.service

引入版本:所有

簡介:8.0之前作為乙個穩定的安卓元件而使用。

安卓8.0版本開始引入了限制,startservice在熄屏一段時間後執行會丟擲 異常,service在熄屏一段時間會被停止,好訊息是bindservice暫時還可用,不過感覺谷歌也是早晚把這個口堵上。

2.alarmmanager

引入版本:所有

簡介:在安卓4.4之前,set可以精準定時;

4.4之後,set 方法和 setrepeating 方法存在一些問題,無法實現準確定時,可能會有些延遲,官方也提供了準確定時的替代方法,即 setexact 和 setwindow,但是這兩個方法都只是執行一次性操作的;

6.0之後,setexact無法在doze狀態執行,需要使用setexactandallowwhileidle。

複製一段專案中的kotlin**(如果使用系統時間而不是rtc時間,需要替換rtc_wakeup標記):

private fun schedulependingintent(ctx: context, pendingintent: pendingintent, delayms: long)  else if (build.version.sdk_int >= build.version_codes.kitkat)  else 

}

在安卓6.0之後,引入doze。為了支援doze模式,增加了新api:setexactandallowwhileidle,這個方法可以在doze進入idle後執行。平時有最小執行間隔,印象是10s?(定時1s後,也是10s後執行)。在進入doze後,最小執行間隔是9min。

如何進入doze idle狀態呢?引入安卓7.0(看的是7.0而不是6.0的**)的doze時序圖:

坑2:華為8.0activity處於stop狀態會推遲alarmmanager

結論:alarammanager雖然各版本有差異,但還是比較穩定的api

3.jobscheduler

引入版本:5.0

簡介:和broadreceiver一樣,在執行期間不需要申請wakelock,onstartjob的返回值決定手動釋放wakelock或是手動。

作為谷歌力推的後台工作元件,jobscheduler有代替alarmmanager的趨勢。和alarmmanager相比,jobscheduler狀態更多,也可以實現如監控後台網路變化等工作。

坑1:在國內很多廠rom中,清理後台後jobscheduler任務會被清理,想喚醒還是別做夢了

坑2:在miui9.2(安卓7.0)系統中,實測jobscheduler在停止充電並熄屏幾分鐘後停止執行,而同一台機改用alarmmanager程式則活蹦亂跳的

坑3:華為8.0activity處於stop狀態會推遲jobscheduler

結論:想拉活,別做夢,老老實實用手機廠商的推送。

想準確,國內有點難,目前就測了乙個miui就不行,想要通用,用回alarmmanager?犧牲準度換取通用性?

4.jobintentservice

引入版本:所有

這貨是在support包中的,所有版本可用,為了替代intentservice,安卓8.0有時無法startservice了,這下用jobintentservice的api完美替代吧

5.broadreceiver

引入版本:所有

再熟悉不過了。

onreceive方法執行時短暫持有wakelock,不能執行耗時操作。

在高版本中谷歌逐漸去除一些隱式廣播以及靜態註冊的支援,動態註冊依然可用。

坑1:想要監聽網路狀態變化,在高版本只能在前台監聽,後台需要用jobscheduler等方式。

android8.0規避startservice無法呼叫的技巧:

國人的智慧型是無窮的,android8.0在後台過久後startservice呼叫丟擲異常,個推是怎麼解決的呢?

啟動乙個空activity,在activity#oncreate中startservice,為個推團隊的機智點讚。

實驗:安卓模擬器原生8.0,插電debug,ui退到後台,startservice後過一段時間服務就會被stop,測試時只用了1分17秒,在ondestroy中直接傳送廣播通知廣播接收器bindservice,服務則不會被殺

紅公尺note4,android7.0,過一段時間service也被stop過,未仔細測試

小公尺8,android8.0,程式退到後台,啟動服務很久未見服務停止,電源已拔

結論:雖然8.0會停止未繫結的service,但國內rom並不都會停止service,同一家不同版本行為都不一樣,保險點都監聽下服務停止就好了

安卓四大元件之ContentProvider

contentprovider是內容提供者 為什麼要有內容提供者?因為在安卓中每乙個應用的資料庫檔案都是私有的,自能在自己的應用中自己使用,別的應用要是想訪問,那麼就需要修改檔案的許可權,這樣資料就變的不安全了,所以就引入了內容提供者。首先來說一下內容提供者中的乙個重要的類uri,熟悉uri會使我們...

安卓四大元件之 service

服務 長期後台執行的沒有介面的activity,程式寫法和activity類似。安卓系統程序管理是按照一定規則的 1.預設情況下,關閉掉乙個應用程式,清空了這個應用程式的任務棧,應用程式的程序還會保留。因為手機記憶體較小,方便下次快速啟動應用程式,但是也會帶來記憶體不足的問題。2.安卓系統有一套記憶...

安卓四大元件之服務

1.服務簡介 服務是安卓中實現程式後台執行的解決方案,它非常適合去執行那些不需要和使用者互動而且還長時間執行的任務,服務的執行不依賴於任何使用者介面,即使程式被切換到後台,或者使用者開啟了另外乙個應用程式,服務仍然能夠保持執行。注意 1 服務並不是執行在乙個獨立的程序中,而是依賴於建立服務時所在的應...