安卓的後臺機制既是安卓的一個優點,也是碎片化很嚴重的一個特性,做爲三款依賴安卓後臺服務的App的開發者,寫下這篇文章來比較一下EMUI和MIUI這兩個最多見的安卓系統的後臺處理邏輯,先把要比較的系統列一下:app
比較後臺機制的前提是兩個系統均使用缺省設置,不考慮諸如省電模式、極簡模式等特殊狀況,這樣符合大部分用戶的使用狀況。測試
常見的安卓App駐留後臺方式有三種:遊戲
這三種後臺模式,我都開發過相應的App,下面會分別舉例來比較。除此之後,還有一些匪夷所思,也非官方承認的謀取駐留後臺的方式,好比播放一個無聲的音樂、開啓一個單像素的懸浮窗等等,畢竟不屬於正道,本文就不比較了。內存
在比較以前,有必要說明一下,對於如今各廠商安卓系統,好比咱們要比較的EMUI和MIUI,僅僅按照這種正規方式註冊服務是不夠的,仍是很容易被系統凍結或殺掉,緣由是由於按正規方式註冊服務,全部的應用均可以作到,後臺多了,加上一些應用沒有節制,手機就必然卡頓費電,因此廠商們的作法也很好理解,默認全殺,作一個只能手工配置的白名單,用戶加入白名單才容許後臺服務,這樣對於大部分普通用戶,不用作任何設置就免受惡意軟件之苦。開發
須要注意,不一樣系統白名單配置稍有不一樣:get
下面開始測試三種後臺方式。table
我開發的微動手勢,就是一個典型的無障礙服務類應用,安卓系統支持應用註冊爲無障礙服務,無障礙服務不只提供了一種駐留後臺的方法,其自己還提供了不少普通應用沒法作到的功能,好比模擬系統交互、模擬手勢等。因此不少安卓App都藉助無障礙服務來完成某些功能,好比就連抖音App都提供了一個無障礙服務。後臺
這裏就以微動手勢爲例,安裝完成並打開無障礙服務,而後我分別測試如下四種狀況:軟件
每種狀況下我進行四種操做測試,這四種狀況都是用戶常作的一些操做,而後判斷微動手勢的後臺是否工做正常,四種操做分別以下:配置
測試結果,我繪製表格以下:
EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
---|---|---|---|---|---|---|---|---|
鎖屏 | 正常 | 凍結 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 正常 | 被殺 | 正常 | 正常 |
劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 正常 | 被殺 | 正常 | 被殺 |
耗盡內存 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
咱們仔細看下這裏的結果,明顯MIUI比EMUI的後臺控制更嚴格,大概總結一下:
兩種方式孰優孰劣,我不作評價,但顯然MIUI的方式,若是想保留後臺,用戶在設置白名單以後,還須要加鎖並當心避免劃卡片。提醒一點,若是你在系統裏同時爲應用設置了容許自啓動,那麼一些後臺應用在被殺以後會馬上重啓,也就是殺的效果變成了重啓。
這裏說的定時服務是個統稱,指藉助安卓的某個"定時"API來實現一個定時運行的後臺,安卓本身在這裏也很亂,前先後後提供了AlarmManager、JobSchedule、WorkManager等不少不兼容的API來支持後臺的定時任務,我這裏統稱爲定時服務,我開發的碎片記憶就是典型的定時服務,這是一個背單詞的應用,須要定時來檢查卡片是否須要複習,而後自動從後臺彈出。
依然按上述測試方法,結果以下:
EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
---|---|---|---|---|---|---|---|---|
鎖屏 | 正常 | 凍結 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 被殺 | 被殺 | 正常 | 正常 |
劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 |
耗盡內存 | 被殺 | 被殺 | 被殺 | 正常 | 正常 | 被殺 | 正常 | 正常 |
從這個結果來看,定時服務相對無障礙服務,優先級要低一些,在某些無障礙服務仍然能夠正常工做的場景下(好比劃卡片和內存耗盡),定時服務就被殺了,不過此次MIUI和EMUI表現的相對一致一些。
這裏有一點值得一提,安卓提供的定時機制裏,有一部分是容許應用被殺後依然能被定時喚醒的,但這樣的話,惡意軟件顯然能夠利用這一點作到永生不死,因此像EMUI和MIUI這樣的系統對這種定時都作了額外的限制,這裏再也不展開詳述了。
Android的前臺服務是一個術語:Foreground Service,表示用戶能夠感知到的後臺服務,因此會在通知欄給出一個常駐通知,這是不少應用使用的後臺機制,我開發的電池守護就使用了這個機制,經過這個機制,讓應用能夠在後臺獲取電量變化信息,從而對用戶進行充電或拔除充電器的告警。
依然使用相同的測試方法,測試結果以下:
EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
---|---|---|---|---|---|---|---|---|
鎖屏 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 正常 | 被殺 | 正常 | 正常 |
劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 正常 | 被殺 | 正常 | 被殺 |
耗盡內存 | 被殺 | 正常 | 被殺 | 正常 | 正常 | 正常 | 正常 | 正常 |
從耗盡內存的測試結果來看,前臺服務的優先級級彷佛介於無障礙服務和定時服務之間,而且EMUI和MIUI依然有不小的差別。
從上面的測試來看,無障礙服務、定時服務、前臺服務幾種服務類型之間有微妙的差別。並且MIUI和EMUI的的處理也有很多的差別,從我測試的兩個版本看,MIUI更嚴苛一些,某些狀況下EMUI不殺,MIUI會殺。對於開發者來講這是比較痛苦的事情,而對於用戶來講,就更難理解這些細微的差別了。好在添加白名單和加鎖以後,基本上仍是能保住後臺,因此這類須要後臺的應用,一般只能引導用戶去作這些設置。
這個測試只對比了MIUI和EMUI,我相信谷歌原生、三星以及其餘廠商仍是會有更多的差別,安卓的碎片化可見一斑。