Service是Android四大組件之一,同時也是四大組件中和Activity最相似的組件,都代表著可執(zhí)行的程序,他們的區(qū)別在于Service一直在后臺運(yùn)行,沒有用戶界面,一旦被啟動就和Activiy一樣擁有生命周期,一般來說,需要顯示界面則使用Activity,不需要則可以選擇Service
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的海珠網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
Activity的生命周期在于用戶打開與關(guān)閉,從用戶打開程序到用戶關(guān)閉程序之間存在,那么Service呢?他的生命周期在于什么,是否也是在用戶的打開與關(guān)閉,Service能否一直存在于后臺
一般情況下,只有系統(tǒng)自帶的應(yīng)用或者廠商定制的應(yīng)用擁有比較高的優(yōu)先級能夠保持后臺服務(wù)一直運(yùn)行,也就是,可以通過root后給予相應(yīng)高的權(quán)限,理論上可以做到一直存在于后臺的服務(wù),那么對于未root的系統(tǒng)呢?
這時候就需要一些小技巧和方法
監(jiān)聽開機(jī)事件,顯式啟動后臺服務(wù),設(shè)置優(yōu)先級,使用AlarmManager發(fā)送定時任務(wù)檢查是否運(yùn)行,如果不允許就重新啟動
把service和activity分開,讓service開機(jī)啟動。設(shè)置一個broadcast receiver接受開機(jī)信號,使用RECEIVE_BOOT_COMPLETED的permission, 然后啟動service。activity啟動后綁定到service上,通過ipc機(jī)制通信,acitivity結(jié)束后松綁。注意安裝后要手動啟動service,不會自動啟動,之后重啟手機(jī)后才會隨開機(jī)啟動。
在內(nèi)存低的時候系統(tǒng)會自動清理進(jìn)程,這時候后臺service可能會被殺掉??梢栽趏nStartCommand中返回START_STICKY,這樣系統(tǒng)有足夠多資源的時候,就會重新開啟service。
使用startForeground啟動后臺服務(wù)“前臺運(yùn)行”的優(yōu)先級,類似于手機(jī)的音樂播放軟件,在打開音樂播放軟件時會在通知欄顯示一條播放進(jìn)度通知條,因?yàn)樗軌蚴购笈_服務(wù)獲取到前臺的優(yōu)先級權(quán)限從而避免被系統(tǒng)干掉,這種做法也是官方所推薦的
“A started service can use the startForeground(int, Notification) API to put the service in a foreground state, where the system considers it to be something the user is actively aware of and thus not a candidate for killing when low on memory. (It is still theoretically possible for the service to be killed under extreme memory pressure from the current foreground application, but in practice this should not be a concern.)”
也就是說,其實(shí)第四種方法更為方便并且被官方所推薦
而 startForeground 的使用也是很簡單的,只需要修改onCreat的內(nèi)容,在其中創(chuàng)建Notification對象,然后用調(diào)用 startForeground(1, Notification)即可實(shí)現(xiàn)