成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android后臺保活實踐總結(jié):即時通訊應(yīng)用無法根治的“頑疾”

移動開發(fā) Android
Android后臺?;顚嵺`總結(jié)基于作者的實踐以及相關(guān)資料的整理,總結(jié)了自已對Android進程和Service?;畹睦斫猓M転槟愕膽?yīng)用開發(fā)帶來啟發(fā)。

前言

Android進程和Service的?;?,是困擾Android開發(fā)人員的一大頑疾。因涉及到省電和內(nèi)存管理策略,各廠商基于自家的理解,在自已ROOM發(fā)布于都對標(biāo)準(zhǔn)Android發(fā)行版作為或多或少的改動,使得應(yīng)用層程序在處理進程和Service?;顔栴}上變的異常復(fù)雜,且很難兼容,因為說不定哪款手機或者哪個版本的省電策略發(fā)生改變,那么隨之而來的就是進程和Service?;畹牟町?。

在應(yīng)用場景上,由于即時通訊應(yīng)用(包括IM聊天應(yīng)用、消息推送服務(wù)等)為了保證消息的全時、實時送達能力,必須要實現(xiàn)進程或Service的保活。而就這一看似不起眼的問題,實際處理起來,因為眾多Android手機和Android系統(tǒng)版本的差異,讓問題的處理充滿了不確定性。

本文基于作者的實踐以及相關(guān)資料的整理,總結(jié)了自已對Android進程和Service保活的理解,希望能為你的應(yīng)用開發(fā)帶來啟發(fā)。

概述

近期做了一個Android項目,涉及到了后臺進程和Service保活的問題,網(wǎng)上找了很多資料,基本的?;罘椒ǘ紲y試了。結(jié)果是:不同的手機,不同的Android版本保活效果各有差異。最難繞過的是個廠商對“后臺程序保活”管理。

本文主要把相應(yīng)的實踐結(jié)果和?;罘椒ㄟM行總結(jié)。然而,因筆者可用的測試真機有限,可能存有不完整的地方,還請及時提出指正并補充,大家共同進步。

手機QQ、微信這樣的大型IM是如何解決?;顔栴}的?

以小米手機為例,MIUI的神隱模式讓很多IM和推送開發(fā)同行糾結(jié)不已:在MIUI深度休眠之后,默認(rèn)會徹底斷開后臺應(yīng)用的socket。但微信、QQ這樣的應(yīng)用,MIUI官方的帖子說了:給這2個應(yīng)用特殊照顧。好吧,特殊照顧,普通的APP只能繼續(xù)折騰了。

(關(guān)于MIUI的神隱模式的討論,見此貼的回復(fù):http://www.52im.net/thread-354-1-1.html)

本文實踐涉及到的真機型號和版本

手機:三星9100-4.1.2,三星9300-4.3,華為G730-4.1.2,華為TL00H-EMUI3.1(android 5.1.1),魅族MX4-Flyme4.2.8.2c(android 4.4.2)。

手頭能用的測試機就這些了。主要測試的service是一個最基本的service,在相應(yīng)的生命周期的觸發(fā)函數(shù)上做了輸出。測試時都沒有添加到后臺保護中,注:三星的機子沒找到有后臺保護設(shè)置的地方。

為什么我們的后臺進程/Service會被結(jié)束掉?

我想到的是有三個方面:

  • Android系統(tǒng)內(nèi)存回收機制;
  • 各廠商對后臺程序的一個管理制度(就是允許程序后臺運行那個);
  • 第三方軟件的清理(360什么的)。

其中有的后臺程序保護把程序結(jié)束的同時會把程序弄成停止?fàn)顟B(tài),導(dǎo)致無法接收廣播!

我們的?;罘桨赣心男?

1)控制onStartCommand函數(shù)的返回值:

我對這個函數(shù)的理解是:當(dāng)服務(wù)被異常終止時,是否重啟服務(wù)?有些文章里面在用這個做?;顣r,修改的是flag,在我實際測試中是無效。有效的做法是直接返回參數(shù)。另外默認(rèn)的flags值為0,是START_STICKY_COMPATIBILITY。

具體代碼如下:

  1. @Override 
  2. publicintonStartCommand(Intent intent,intflags,intstartId) { 
  3.     // TODO Auto-generated method stub 
  4.     returnSTART_STICKY; 
  5.     //return super.onStartCommand(intent, flags, startId); 

測試結(jié)果:

魅族的機子無效,不管默認(rèn)還是修改參數(shù),在DDMS里面直接結(jié)束進程后都不會重啟服務(wù)。其它三臺機子(9100沒測):默認(rèn)參數(shù)的情況下就會重啟服務(wù),return START_STICKY 會重啟,return START_NOT_STICKY 不會重啟。

另外:用360一鍵清理,或者360超級ROOT的手機優(yōu)化,會殺死進程,過會兒還是會重啟,只是會慢很多,大概是在排隊重啟服務(wù)。

2)在service 的onDestory里面重啟服務(wù):

這個在所有能觸發(fā)onDestory的情況下都是有效的。4臺測試機都測試過。直接startService 或者發(fā)送廣播重啟都可以 。

但能觸發(fā)onDestory的情況,我不知道內(nèi)存回收會不會觸發(fā)。另外兩種情況(2,3)是不觸發(fā)的。我的測試方法是在“設(shè)置”-> 應(yīng)用管理-> 正在運行-> 停止服務(wù)。(這個是正常停止服務(wù),會觸發(fā)onDestory,所以上面的onStartCommand效果不會觸發(fā)。)

3)提高服務(wù)的優(yōu)先級:

這個主要是針對***種kill服務(wù)的情況,內(nèi)存回收機制。由于這個測試比較難搭建。360清理什么把后臺的進程都?xì)⒌模w現(xiàn)不出優(yōu)先級這樣的概念。我的建議是能提高就提高,下面幾個實驗。

[1] 前臺service:

創(chuàng)建一個通知使自己成為前臺service

測試結(jié)果:

360一鍵清理和手機優(yōu)化,不會把該service結(jié)束掉。

[2] 對于后臺保護:

華為G730不結(jié)束service,魅族和華為TL00H都會結(jié)束service。通知欄的?;钚Ч€是可以的,一般的應(yīng)用要求基本能滿足了。

[3] 若有root權(quán)限:

android:persistent="true",并放入system/app中

測試結(jié)果:

效果一般,三星9100上用360等清理工具殺不掉進程,在華為G730上沒什么效果.(這個測試跟onStartCommand有點干擾)。

4)守護進程:

雙服務(wù):360會同時殺掉兩個服務(wù),分兩個apk也一樣。

native守護進程:360不會殺掉native的守護進程,但在魅族和華為TL00H中待機一段時間后還是會被殺掉。

結(jié)論和待續(xù):

1. 一般的應(yīng)用添加到后臺保護進程后,改個onStartCommand返回值,再加個通知?;旧洗蟛糠侄寄鼙;盍?。

2. 雙服務(wù)我覺得沒有native守護進程來的好,雖然360,微信什么的都有幾個進程服務(wù),但如果不添加到后臺?;畹脑?,效果一樣不能?;?,也會進入停止?fàn)顟B(tài)。

3. 但是.360手機助手會創(chuàng)建雙natice守護進程做相互的看守。存活的效果會高一點點。“沒添加到后臺?;?rdquo;一般只會殺一次,(魅族是屏幕關(guān)閉后5分鐘,華為TL00H是屏幕關(guān)閉時)。

附個native守護進程:利用socket來判斷服務(wù)是否存在,需要在被保活的服務(wù)里創(chuàng)建一個監(jiān)聽socket。調(diào)試信息會在SD卡目錄下創(chuàng)建一個daemon.log。使用方法:NDKFork port包名/.服務(wù)名。具體下載鏈接:http://download.csdn.net/detail/pvlking/9412815

Android應(yīng)用實現(xiàn)保活的基本原理總結(jié)

都是通過雙進程互拉以及設(shè)置進程的重要性,除非你root后,把自己的進程設(shè)置成系統(tǒng)進程。

互拉的方式有很多種:

  • 可以通過監(jiān)聽系統(tǒng)廣播來把自己拉起來
  • 可以多個app相互拉
  • 可以把自己的服務(wù)搞成前臺服務(wù)
  • 在service的onstart方法里返回 STATR_STICK
  • 添加Manifest文件屬性值為android:persistent=“true”
  • 覆寫Service的onDestroy方法
  • 服務(wù)互相綁定
  • 設(shè)置鬧鐘,定時喚醒
  • 自己的app在native層fork一個子進程來與主進程互拉。

綜上所述,總結(jié)下來就是,目前實現(xiàn)Android后臺?;顩]有***實現(xiàn),只能針對不同的機型綜合使用上面列舉的方法,同時祈禱自已APP的用戶不要遇到奇葩機型的?;顔栴}。

推薦一個開源的解決方案

1)源碼托管地址

源碼托管地址是:https://github.com/52im/MarsDaemon。

2)實現(xiàn)原理

原理:使用Jni,在 c端 fork進程,檢測Service是否存活,若Service已被殺死,則進行重啟Service. 至于檢測方式,可以輪詢獲取子進程Pid,若為1, 則說明子進程被Init進程所領(lǐng)養(yǎng),已經(jīng)成為了孤兒進程. 但是這種方式比較消耗電量,并且由于不同手機系統(tǒng)定制的改變,當(dāng)應(yīng)用被強制停止時,父進程并不一定被真正殺死,因此在一些特定機型上是無法通過此方式進行判斷. 這里推薦使用liunx socket的方式進行類似心跳包的檢測,并且當(dāng)觸發(fā)檢測Service是否被殺死之前,需要判斷應(yīng)用是否已經(jīng)被卸載,如果應(yīng)用已經(jīng)被卸載,則不再進行檢測Service行為,直接調(diào)用exit(0)退出子進程,避免浪費系統(tǒng)資源和消耗電量.

注意: 目前在Android 5.0系統(tǒng)上會把fork出來的進程放到一個進程組里, 當(dāng)程序主進程掛掉后,也會把整個進程組殺掉,因此用fork的方式也無法在Android5.0及以上系統(tǒng)實現(xiàn)守護進程. 這個是系統(tǒng)層面的限制,當(dāng)然也是為了優(yōu)化整個的系統(tǒng)環(huán)境,守護進程給手機帶來的體驗并不好

具體見源碼:http://androidxref.com/5.0.0_r2/ ... /ProcessRecord.java

 

好消息:

Android5.0 以上目前已在 https://github.com/52im/MarsDaemon 中被黑科技攻克,部分機型可能無法起到作用,但思路很值得借鑒,代碼結(jié)構(gòu)也不錯, 具體方案請見源碼哦。

 

責(zé)任編輯:武曉燕 來源: blogjava
相關(guān)推薦

2021-08-14 09:23:03

即時通訊IM互聯(lián)網(wǎng)

2011-10-20 22:25:49

網(wǎng)易即時通

2011-06-30 10:50:24

即時通訊

2011-08-04 14:50:07

263EM

2012-06-11 09:27:17

imo即時通訊

2016-09-28 09:48:40

網(wǎng)易云信IM云服務(wù)

2012-03-05 11:06:28

imo即時通訊

2012-03-30 10:47:05

imo

2013-10-16 11:32:55

imoRTX即時通訊

2010-04-30 10:35:09

即時通訊MSN

2014-11-17 11:58:49

即時通訊云

2012-03-29 13:47:18

即時通訊

2021-10-20 05:55:22

即時通訊IM網(wǎng)絡(luò)

2012-03-15 14:55:03

imo即時通訊

2012-05-24 10:31:16

imo即時通訊

2012-05-07 10:20:55

imo即時通訊

2015-08-13 10:02:48

容聯(lián)云通訊

2015-09-14 17:32:22

容聯(lián)即時通訊云

2017-09-27 13:54:11

即時通訊網(wǎng)易云
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩欧美在线视频 | 爱操影视| 黄色大片视频 | 黄色片网此 | 国产成人免费视频网站视频社区 | 国产精品福利一区二区三区 | 精品国产欧美一区二区 | 91久久夜色精品国产网站 | 精品久久网 | 亚洲三区视频 | 伊人久久综合 | 久久高清 | 中文字幕1区 | 国产精品久久国产精品 | 国产一区二区三区在线 | 久久99这里只有精品 | 亚洲狠狠丁香婷婷综合久久久 | 久久精品无码一区二区三区 | 天天躁日日躁aaaa视频 | 男人天堂网址 | 久久国品片 | 成人黄色在线 | 精品国产18久久久久久二百 | 麻豆精品久久久 | 国产乱码一区 | 亚洲成人网在线观看 | 日本一区二区三区视频在线 | 久久人体视频 | 在线一区| 成人黄在线观看 | www狠狠干| 欧美综合在线观看 | 香蕉婷婷 | 盗摄精品av一区二区三区 | 中文字幕一区二区三区在线视频 | 日韩精品一区二区三区中文在线 | 一区二区三区国产 | 福利网站导航 | 男女羞羞视频在线免费观看 | 天天操天天射天天 | 欧美一区在线视频 |