版權聲明:程序員
本公衆號發佈的全部文章,均屬於原創,版權歸本公衆號全部。shell
容許有條件轉載,轉載請附帶底部二維碼。spa
Foreground Service被稱爲前臺服務,通常用於提升Service的優先級,這樣在正常系統回收的時候,不會被系統殺死。內存
前臺服務一般用於那些,比較須要有穩定性,而且持續在後臺運行的操做。例如:音樂播放器、下載服務等。這樣在系統內存較低而觸發Low Memory Killer的時候,不會被殺掉。爲此,Google爲了讓這樣的一個頑強的服務在後臺運行,須要強制在通知欄設置一個可被顯示的通知。它被放到了「正在運行(Ongoing)」標題之下,意味着只有這個Service完成既定任務,或者被從前臺刪除掉,這個通知纔會被刪除。rem
二、如何使用前臺Service文檔
前臺服務使用起來很是的簡單,只須要兩個方法:it
具體的功能,看上面的文檔已經標識清楚了。就不一一解釋了,簡單來講,只須要在服務啓動的時候,調用startForeground()方法,在其中傳入一個待顯示的Notification便可。中止前臺服務,須要調用stopForeground()方法。io
啓動完成服務以後,在系統通知欄中,就能夠看到被置爲前臺服務的通知提示。class
立刻進入主題了。後臺
有時候某些功能,爲了讓Service能夠常駐內存中,以免在觸發Low Memory Killer的時候不被系統殺掉回收。通常就會想到前臺服務這個功能,將服務置換到前臺運行。可是前臺服務又必須在通知欄中,常駐一條通知,不管怎麼操做都不會消失。可是有時候確實會有一些需求,須要在後臺一直保持運行,可是又想作到用戶無感知。那麼就須要想辦法去掉這個在通知欄中顯示的Notification。
那麼問題來了,如何去掉前臺服務的Notification?
試過不少方法,如今行之有效的方法是:
須要兩個前臺服務,共享同一個Notification ID。
一個服務啓動完畢以後,立刻中止本身,會去掉通知欄的通知。
而以前已經藉助這個ID保持前臺的服務,依然會處於前臺的狀態不變。
先建立【B服務】。
而後修改咱們真是須要運行的【A服務】。
這樣運行完成以後,查看通知欄,發現確實這個前臺服務的通知,被從通知欄中移除了。
那麼,既然這個服務已經被運行了,可是是否真的是前臺服務呢?接下來咱們用dumpsys命令驗證一下,看看當前的服務是否和咱們預期的一致。
首先須要進入adb shell的環境,而後再執行
$ dumpsys activity services | grep plokmju
注意看,isForeground標識當前服務是前臺服務,而確實用於消除通知的BootService也已經被正常中止了。
雖然這樣的方式確實很是的方即可以將一個前臺的服務,去掉通知欄通知,作到真的讓用戶無感知。可是做爲一個有節操的程序員,使用這種方案必定要權衡一下,是否真的須要這樣一個服務在後臺運行。固然,這樣作爲一個Bug的存在,聽說在Android 7.1的時候被修復了,可是鑑於如今設備版本的鋪量尚未那麼大,這種方式在低版本上依然適用。