App為什么要進行應用蓖7蓿活
其實搞保活的目的倒不是為了干什么見不得人的壞事(但不排除動機不純的開發(fā)者),主要是像IM即時通訊應用和資訊類應用等需要搞后臺消息推送时迫、運動類應用需要在后臺實時監(jiān)測用戶的運動數(shù)據(jù)等,因為現(xiàn)在越來越多的手機廠商為了省電策略考慮癞揉,基本上如果你的應用沒有被加入白名單溺欧,一旦處于后臺就會被系統(tǒng)限制甚至干掉,但使用APP的用戶才不聽你這些解釋——反正“我”就要你的APP能如期正常運行姐刁,開發(fā)者也是不得已而為之聂使。
實際上,對于后臺消息推送能力柏靶,Android原版系統(tǒng)早就內置了系統(tǒng)級推送服務(跟iOS上的APNS服務是一個東西),它就是GCM服務(現(xiàn)在升級為FCM了)痘昌,但眾所周之的原因,谷哥的服務在國內都是用不了的
Android各版本出現(xiàn)的绷咎Γ活技術
主要設計AB兩個不同服務進程,A進程的服務輪詢檢查B進程的服務是否存活乎婿,沒存活的話將其拉起街佑,同樣B進程服務輪詢檢查A進程服務是否存活,沒存活的話也將其拉起
降低omm_adj值森逮,盡量保證進程不被系統(tǒng)殺死
進程在內存中時活動主要有五種狀態(tài):即前臺進程磁携、可見進程、服務進程谊迄、后臺進程、空進程歪脏,這幾種狀態(tài)的進程優(yōu)先級由高到低,oom_adj值由低到高(在ProcessList定義)婿失。然后Android系統(tǒng)會根據(jù)當前系統(tǒng)資源和進程oom_adj值來回收相應的進程啄寡,前臺進程一般不會被回收,空進程最容易被回收
實現(xiàn)方案:前臺Service 一像素鎖屏 后臺循環(huán)播放一段無聲廣播
JobScheduler是谷歌在Android 5.0引入的一個能夠執(zhí)行某項任務的API懒浮,它允許APP在將來達到一定條件時執(zhí)行指定的任務姻乓。通常情況下,即使APP被強制停止蹋岩,預定的任務仍然會被執(zhí)行
第三方推送平臺
極光推送
友盟推送
個推
阿里云移動推送
騰訊信鴿
百度云推送
特征:app級長連接通道剪个;由系統(tǒng)事件廣播保活進程,獨立進程绒疗,共用長連接骂澄,鏈式喚醒等
廠商:提供推送及增值服務,如友盟推送磨镶、個推健提、騰訊信鴿、極光推送等
優(yōu)點:通用性較強私痹,各種ROM上都能用,app在活動時成功率與系統(tǒng)級推送相當
缺點:app被殺死后成功率較低账千,這點在國產ROM上尤為明顯癞蚕。進程保活桦山、鏈式喚醒會導致耗電量增加恒水。進程彼瞧耄活和喚醒機制受限于系統(tǒng)及各種優(yōu)化軟件
第三方推送一般使用長連接和應用間互相喚醒的方式來保證推送的到達率,但是此種方式用戶體驗很差捂人,存在內存大量占用以及電量消耗加快等負面影響。而且 Andoird 5.0 之后酸纲,后臺進程以及定時任務的限制瑟匆,保持長連接正在變得越來越困難,所以即使是極光疾嗅、友盟等這樣專業(yè)的推送平臺,達到率也不會有他們宣稱的那么高代承,一般估計在 50%~70%,甚至更低掖棉。不過意荤,可以考慮通過商務合作手段讓手機廠家給應用開白名單
第三方平臺的推送服務的優(yōu)點是通道聚合,接入成本低紫谷。缺點除了上面提到的到達率不如系統(tǒng)級推送捐寥,另外還有用戶數(shù)或設備數(shù)的限制,也就是說在量大的情況下部分推送平臺需要收費握恳。
第三方推送平臺對比
平臺 | 是否收費 | 廠商通道支持 | 到達率 | 集成難度 |
---|---|---|---|---|
友盟 | 否 | 支持 | 高 | 較高 |
極光 | 高級版收費 | 支持 | 高 | 一般 |
個推 | VIP收費 | 支持 | 高 | 一般 |
阿里移動推送 | 設備數(shù)>5萬收費 | 支持 | 一般 | 一般 |
騰訊信鴿 | 否 | 支持 | 一般 | 一般 |
百度云推送 | 否 | 不支持 | 高 | 一般 |
通道
目前擁有廠商通道的廠商有:小米乡洼,華為,魅族束昵,OPPO,VIVO
- 阿里云使用淘寶通道
- 騰訊信鴿使用的是騰訊系游戲的通道(沒有微信或QQ通道)
- 個推有微博巴比,網(wǎng)易新聞礁遵,滴滴等
- 小米推送在miui上使用系統(tǒng)通道,非miui手機上政勃,自己一個通道晰赞,不共享通道
- 華為推送在華為手機上使用系統(tǒng)通道选侨,在非華為手機上使用需要額外安裝一個app
- 極光和個推都是有廠商通道服務然走,但是基本都是針對VIP收費用戶
廠商通道
小米推送在miui上使用系統(tǒng)通道,非miui手機上晨仑,自己一個通道拆檬,不共享通道;app被殺死后在MIUI系統(tǒng)下仍能收到通知消息答捕;非MIUI系統(tǒng)下屑那,小米推送可以使用app級通道,此時與三方推送類似
華為推送在華為手機上使用系統(tǒng)通道持际,在非華為手機上使用需要額外安裝一個app;app被殺死后在EMUI 5.0 系統(tǒng)下仍能收到通知消息益眉;僅支持 EMUI 5.0以上版本姥份,低版本和其他ROM 創(chuàng)建連接失敗,完全不能使用
自啟動管理:需要把應用加到【自啟動管理】列表朱庆,否則殺進程或重新開機后進程不會開啟闷祥,只能手動開啟應用
后臺應用保護:需要手動把應用加到此列表傲诵,否則設備進入睡眠后會自動殺掉應用進程,只有手動開啟應用才能恢復運行
通知管理:應用狀態(tài)有三種:提示悟衩、允許栓拜、禁止惠昔。禁止應用則通知欄不會有任何提醒
在Flyme上屬于系統(tǒng)級服務挑势,共享系統(tǒng)級長連接,客戶端服務省電省流量
在ColorOS上使用系統(tǒng)級通道来氧,共享ColorOS系統(tǒng)級長連接香拉,服務穩(wěn)定,保證消息的高到達率
在Funtouch OS上共享系統(tǒng)級通道
相對而言扑毡,小米推送的完成度更高盛险,在系統(tǒng)推送的基礎上實現(xiàn)了三方通道,兼容了非 MIUI 的 Android 機枉层,而且有 IOS 平臺的SDK,在一定程度上可以替代三方推送膜赃。華為推送僅支持自家EMUI 5.0以上系統(tǒng)揉忘。
-
使用廠商通道會有如下問題:
- 需要一家一家下載SDK、注冊開發(fā)者賬號疲眷、搞手機端對接您朽、搞服務端對接;
- 各廠商的SDK都打包在一個APP里哗总,可能存在各種兼容性問題讯屈;
- 因為ROOM版本問題,即使同一個廠商的手機的同一套SDK也存在新舊ROOM的兼容性問題涮母;
- 這一堆的SDK躁愿,各種jar包讓你的APP莫名變大了不少彤钟;
- 服務端要對接各種廠商的推送后臺怜跑,各家的技術水平、SDK水準性芬、服務穩(wěn)定性參差不齊,對接起來有難度
- 有些手機小廠并沒有自已的推送通道辫樱,仍然需要自建通道俊庇。
實際測試總結
- 接入小米推送,在小米手機上可以實現(xiàn)系統(tǒng)級的推送搬男,只要手機系統(tǒng)不掛彭沼,推送都會秒到;在其它手機上(魅族)褐奴,應用在前臺時于毙,推送秒到,應用在后臺未被殺掉時唯沮,推送秒到介蛉,若應用被清理掉或時間過長被系統(tǒng)清理掉時,推送無法到達(會在下次啟動APP時推送到)
- 接入魅族推送甘耿,在魅族手機上是系統(tǒng)級推送竿滨,有1秒左右的延遲
總結
- 如果選擇第三方推送平臺優(yōu)先選擇支持廠商通道的推送平臺
- 如果是從零開開始開發(fā),只接入小米推送毁葱,就可以覆蓋到大部分 Android 機型,并且可以在 MIUI 上獲得加成
- 如果項目中已經接入了三方推送而效果又不理想筷频,可以考慮單獨接入小米前痘、華為等平臺的 SDK 來提高在國產 ROM 上的送達率,需要自行處理數(shù)據(jù)整合的問題
- 如果追求高送達率和接入成本坯癣,可以考慮已有的支持廠商通道的第三方推送平臺如:友盟最欠,極光,騰訊信鴿蚜点,個推等等
- Amdroid7.0及之后拌阴,進程保活手段很難奏效撮躁;Android越往后迭代捺氢,限制越嚴格。