安卓的后臺(tái)機(jī)制既是安卓的一個(gè)優(yōu)勢(shì),也是碎片化很嚴(yán)重的一個(gè)特性罩缴,作為三款依賴安卓后臺(tái)服務(wù)的App的開發(fā)者蚊逢,寫下這篇文章來比較一下EMUI和MIUI這兩個(gè)最常見的安卓系統(tǒng)的后臺(tái)處理邏輯,先把要比較的系統(tǒng)列一下:
- EMUI 10.0.0箫章, Android 10
- MIUI 12.0.6烙荷, Android 10
比較后臺(tái)機(jī)制的前提是兩個(gè)系統(tǒng)均使用缺省設(shè)置,不考慮諸如省電模式檬寂、極簡(jiǎn)模式等特殊情況终抽,這樣符合大部分用戶的使用情況。
概述
常見的安卓App駐留后臺(tái)方式有三種:
- 注冊(cè)系統(tǒng)服務(wù)桶至,比如無障礙服務(wù)
- 使用安卓定時(shí)服務(wù)
- 常駐通知欄的前臺(tái)服務(wù)昼伴,即Foreground Service
這三種后臺(tái)模式,我都開發(fā)過相應(yīng)的App镣屹,下面會(huì)分別舉例來比較圃郊。除此以后,還有一些匪夷所思女蜈,也非官方認(rèn)可的謀取駐留后臺(tái)的方式持舆,比如播放一個(gè)無聲的音樂、開啟一個(gè)單像素的懸浮窗等等伪窖,畢竟不屬于正道逸寓,本文就不比較了。
在比較之前覆山,有必要說明一下竹伸,對(duì)于現(xiàn)在各廠商安卓系統(tǒng),比如我們要比較的EMUI和MIUI汹买,僅僅按照這種正規(guī)方式注冊(cè)服務(wù)是不夠的佩伤,還是很容易被系統(tǒng)凍結(jié)或殺掉,原因是因?yàn)榘凑?guī)方式注冊(cè)服務(wù)晦毙,所有的應(yīng)用都可以做到生巡,后臺(tái)多了,加上一些應(yīng)用沒有節(jié)制见妒,手機(jī)就必然卡頓費(fèi)電孤荣,所以廠商們的做法也很好理解,默認(rèn)全殺,做一個(gè)只能手工配置的白名單盐股,用戶加入白名單才允許后臺(tái)服務(wù)钱豁,這樣對(duì)于大部分普通用戶,不用做任何設(shè)置就免受惡意軟件之苦疯汁。
需要注意牲尺,不同系統(tǒng)白名單配置稍有不同:
- MIUI 設(shè)置 》應(yīng)用設(shè)置 》應(yīng)用管理 》選擇應(yīng)用 》 設(shè)置省電策略、自啟動(dòng)
- EMUI 設(shè)置 》 應(yīng)用 》 應(yīng)用啟動(dòng)管理 》 選擇應(yīng)用 》 設(shè)置允許后臺(tái)活動(dòng)幌蚊、自啟動(dòng)
下面開始測(cè)試三種后臺(tái)方式谤碳。
無障礙服務(wù)
我開發(fā)的微動(dòng)手勢(shì),就是一個(gè)典型的無障礙服務(wù)類應(yīng)用溢豆,安卓系統(tǒng)支持應(yīng)用注冊(cè)為無障礙服務(wù)蜒简,無障礙服務(wù)不僅提供了一種駐留后臺(tái)的方法,其本身還提供了很多普通應(yīng)用無法做到的功能漩仙,比如模擬系統(tǒng)交互搓茬、模擬手勢(shì)等。所以很多安卓App都借助無障礙服務(wù)來完成某些功能队他,比如就連抖音App都提供了一個(gè)無障礙服務(wù)卷仑。
這里就以微動(dòng)手勢(shì)為例,安裝完成并打開無障礙服務(wù)漱挎,然后我分別測(cè)試以下四種情況:
- 默認(rèn):就是默認(rèn)安裝后不做任何設(shè)置
- 加鎖:在多任務(wù)界面中給應(yīng)用的卡片加鎖
- 白名單:在系統(tǒng)中將應(yīng)用加入后臺(tái)白名單
- 鎖+白名單:上面兩個(gè)都設(shè)置
每種情況下我進(jìn)行四種操作測(cè)試系枪,這四種情況都是用戶常做的一些操作雀哨,然后判斷微動(dòng)手勢(shì)的后臺(tái)是否工作正常磕谅,四種操作分別如下:
- 鎖屏:鎖屏等一分鐘后再解鎖
- 劃卡片:直接在多任務(wù)頁(yè)面中劃去應(yīng)用
- 一鍵清理:在多任務(wù)頁(yè)面中點(diǎn)一鍵清理
- 耗盡內(nèi)存:通過啟動(dòng)多個(gè)大型軟件或游戲擠占剩余內(nèi)存
測(cè)試結(jié)果,我繪制表格如下:
EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
---|---|---|---|---|---|---|---|---|
鎖屏 | 正常 | 凍結(jié) | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 正常 | 被殺 | 正常 | 正常 |
劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 正常 | 被殺 | 正常 | 被殺 |
耗盡內(nèi)存 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
我們仔細(xì)看下這里的結(jié)果雾棺,明顯MIUI比EMUI的后臺(tái)控制更嚴(yán)格膊夹,大概總結(jié)一下:
- MIUI認(rèn)為用戶操作優(yōu)先于用戶白名單,所以即使加入白名單捌浩,通過劃卡片依然將應(yīng)用殺掉放刨。
- EMUI認(rèn)為用戶白名單優(yōu)先,只要加入白名單尸饺,用戶即使劃卡片进统,后臺(tái)都能正常保留,只將前臺(tái)界面關(guān)閉浪听。
兩種方式孰優(yōu)孰劣螟碎,我不做評(píng)價(jià),但顯然MIUI的方式迹栓,如果想保留后臺(tái)掉分,用戶在設(shè)置白名單之后,還需要加鎖并小心避免劃卡片。提醒一點(diǎn)酥郭,如果你在系統(tǒng)里同時(shí)為應(yīng)用設(shè)置了允許自啟動(dòng)华坦,那么一些后臺(tái)應(yīng)用在被殺之后會(huì)立刻重啟,也就是殺的效果變成了重啟不从。
定時(shí)服務(wù)
這里說的定時(shí)服務(wù)是個(gè)統(tǒng)稱惜姐,指借助安卓的某個(gè)"定時(shí)"API來實(shí)現(xiàn)一個(gè)定時(shí)運(yùn)行的后臺(tái),安卓自己在這里也很亂椿息,前前后后提供了AlarmManager载弄、JobSchedule、WorkManager等很多不兼容的API來支持后臺(tái)的定時(shí)任務(wù)撵颊,我這里統(tǒng)稱為定時(shí)服務(wù)宇攻,我開發(fā)的碎片記憶就是典型的定時(shí)服務(wù),這是一個(gè)背單詞的應(yīng)用倡勇,需要定時(shí)來檢查卡片是否需要復(fù)習(xí)逞刷,然后自動(dòng)從后臺(tái)彈出。
依然按上述測(cè)試方法妻熊,結(jié)果如下:
EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
---|---|---|---|---|---|---|---|---|
鎖屏 | 正常 | 凍結(jié) | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 被殺 | 被殺 | 正常 | 正常 |
劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 | 被殺 |
耗盡內(nèi)存 | 被殺 | 被殺 | 被殺 | 正常 | 正常 | 被殺 | 正常 | 正常 |
從這個(gè)結(jié)果來看夸浅,定時(shí)服務(wù)相對(duì)無障礙服務(wù),優(yōu)先級(jí)要低一些扔役,在某些無障礙服務(wù)仍然可以正常工作的場(chǎng)景下(比如劃卡片和內(nèi)存耗盡)帆喇,定時(shí)服務(wù)就被殺了,不過這次MIUI和EMUI表現(xiàn)的相對(duì)一致一些亿胸。
這里有一點(diǎn)值得一提坯钦,安卓提供的定時(shí)機(jī)制里,有一部分是允許應(yīng)用被殺后依然能被定時(shí)喚醒的侈玄,但這樣的話婉刀,惡意軟件顯然可以利用這一點(diǎn)做到永生不死,所以像EMUI和MIUI這樣的系統(tǒng)對(duì)這種定時(shí)都做了額外的限制序仙,這里不再展開詳述了突颊。
前臺(tái)服務(wù)
Android的前臺(tái)服務(wù)是一個(gè)術(shù)語(yǔ):Foreground Service,表示用戶可以感知到的后臺(tái)服務(wù)潘悼,所以會(huì)在通知欄給出一個(gè)常駐通知律秃,這是很多應(yīng)用使用的后臺(tái)機(jī)制,我開發(fā)的電池守護(hù)就使用了這個(gè)機(jī)制治唤,通過這個(gè)機(jī)制棒动,讓應(yīng)用可以在后臺(tái)獲取電量變化信息,從而對(duì)用戶進(jìn)行充電或拔除充電器的告警肝劲。
依然使用相同的測(cè)試方法迁客,測(cè)試結(jié)果如下:
EMUI | MIUI | EMUI(加鎖) | MIUI(加鎖) | EMUI(白名單) | MIUI(白名單) | EMUI(鎖+白名單) | MIUI(鎖+白名單) | |
---|---|---|---|---|---|---|---|---|
鎖屏 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 | 正常 |
一鍵清理 | 被殺 | 被殺 | 正常 | 正常 | 正常 | 被殺 | 正常 | 正常 |
劃卡片 | 被殺 | 被殺 | 被殺 | 被殺 | 正常 | 被殺 | 正常 | 被殺 |
耗盡內(nèi)存 | 被殺 | 正常 | 被殺 | 正常 | 正常 | 正常 | 正常 | 正常 |
從耗盡內(nèi)存的測(cè)試結(jié)果來看郭宝,前臺(tái)服務(wù)的優(yōu)先級(jí)級(jí)似乎介于無障礙服務(wù)和定時(shí)服務(wù)之間,并且EMUI和MIUI依然有不小的差異掷漱。
總結(jié)
從上面的測(cè)試來看粘室,無障礙服務(wù)、定時(shí)服務(wù)卜范、前臺(tái)服務(wù)幾種服務(wù)類型之間有微妙的差異衔统。而且MIUI和EMUI的的處理也有不少的差異,從我測(cè)試的兩個(gè)版本看海雪,MIUI更嚴(yán)苛一些锦爵,某些情況下EMUI不殺,MIUI會(huì)殺奥裸。對(duì)于開發(fā)者來說這是比較痛苦的事情险掀,而對(duì)于用戶來說,就更難理解這些細(xì)微的差異了湾宙。好在添加白名單和加鎖之后樟氢,基本上還是能保住后臺(tái),所以這類需要后臺(tái)的應(yīng)用侠鳄,通常只能引導(dǎo)用戶去做這些設(shè)置埠啃。
這個(gè)測(cè)試只對(duì)比了MIUI和EMUI,我相信谷歌原生伟恶、三星以及其他廠商還是會(huì)有更多的差異碴开,安卓的碎片化可見一斑。