一個沒有Notification的前臺服務

版權聲明:程序員

本公衆號發佈的全部文章,均屬於原創,版權歸本公衆號全部。shell

容許有條件轉載,轉載請附帶底部二維碼。spa

一、什麼是Foreground Service

Foreground Service被稱爲前臺服務,通常用於提升Service的優先級,這樣在正常系統回收的時候,不會被系統殺死。內存

前臺服務一般用於那些,比較須要有穩定性,而且持續在後臺運行的操做。例如:音樂播放器、下載服務等。這樣在系統內存較低而觸發Low Memory Killer的時候,不會被殺掉。爲此,Google爲了讓這樣的一個頑強的服務在後臺運行,須要強制在通知欄設置一個可被顯示的通知。它被放到了「正在運行(Ongoing)」標題之下,意味着只有這個Service完成既定任務,或者被從前臺刪除掉,這個通知纔會被刪除。rem

二、如何使用前臺Service文檔

前臺服務使用起來很是的簡單,只須要兩個方法:it

startForeground_method.png

具體的功能,看上面的文檔已經標識清楚了。就不一一解釋了,簡單來講,只須要在服務啓動的時候,調用startForeground()方法,在其中傳入一個待顯示的Notification便可。中止前臺服務,須要調用stopForeground()方法。io

啓動完成服務以後,在系統通知欄中,就能夠看到被置爲前臺服務的通知提示。class

notification.png

二、去掉前臺服務的Notification

立刻進入主題了。後臺

有時候某些功能,爲了讓Service能夠常駐內存中,以免在觸發Low Memory Killer的時候不被系統殺掉回收。通常就會想到前臺服務這個功能,將服務置換到前臺運行。可是前臺服務又必須在通知欄中,常駐一條通知,不管怎麼操做都不會消失。可是有時候確實會有一些需求,須要在後臺一直保持運行,可是又想作到用戶無感知。那麼就須要想辦法去掉這個在通知欄中顯示的Notification。

那麼問題來了,如何去掉前臺服務的Notification?

試過不少方法,如今行之有效的方法是:

  1. 須要兩個前臺服務,共享同一個Notification ID。

  2. 一個服務啓動完畢以後,立刻中止本身,會去掉通知欄的通知。

  3. 而以前已經藉助這個ID保持前臺的服務,依然會處於前臺的狀態不變。

三、實施方案

先建立【B服務】。

Notice_bootService.png

而後修改咱們真是須要運行的【A服務】。

notice_real_service.png

這樣運行完成以後,查看通知欄,發現確實這個前臺服務的通知,被從通知欄中移除了。

四、驗證方案

那麼,既然這個服務已經被運行了,可是是否真的是前臺服務呢?接下來咱們用dumpsys命令驗證一下,看看當前的服務是否和咱們預期的一致。

首先須要進入adb shell的環境,而後再執行

$ dumpsys activity services | grep plokmju

isForeground.png

注意看,isForeground標識當前服務是前臺服務,而確實用於消除通知的BootService也已經被正常中止了。

五、結語

雖然這樣的方式確實很是的方即可以將一個前臺的服務,去掉通知欄通知,作到真的讓用戶無感知。可是做爲一個有節操的程序員,使用這種方案必定要權衡一下,是否真的須要這樣一個服務在後臺運行。固然,這樣作爲一個Bug的存在,聽說在Android 7.1的時候被修復了,可是鑑於如今設備版本的鋪量尚未那麼大,這種方式在低版本上依然適用。

公衆號二維碼.jpg

相關文章
相關標籤/搜索