Android程式保活方案

冬榮發表於1970-01-01

大家是不是經常被產品小姐姐問到程式保活問題,如果你說實現不了小姐姐馬上就要懟你了,那人家微信是怎麼做到的。面對這種情況我們機智的程式設計師當然要挺身而出一套一套先把她說愣,然後再把小姐姐抱回家從此過上xing福的生活。

OK,空口無憑,目標有了說幹就幹,接下來我們來分析一下怎麼做到。我們知道一個service以start的方式開啟的話是不會受activity生命週期影響的,也就是說我們只要提升service優先順序為前臺程式按理說就能保活了啊,程式設計師A笑了笑,這個不要太簡單,我先來試試,於是程式設計師A啪啪啪的三分鐘程式碼就寫好了,程式碼如下:

Android程式保活方案

小組成員紛紛帶著疑問的眼神盯著小A的pixel手機看,產品小姐姐露出了崇拜的眼神,看著ide不光在按返回鍵退出的時候打著Log,就連手動清除程式的時候Log都在,小姐姐感覺自己戀愛了,慢慢地往程式設計師A身上靠去。這時候程式設計師B及時制止,能否拿我手機試試?小B掏出了他的小米手機,程式一跑起來小B就手動殺了下程式,Log瞬間停止了。。。嘴角露出了一絲得意的微笑,小樣,就你這技術還想抱得美人歸?小B立馬搶風頭擋住小姐姐解釋道:只有部分系統比如谷歌原生的系統這樣做才能做到前臺程式不會被清理掉,對於國產系統來說,早就對這個方式進行了限制。小姐姐嬌弱地問到,那應該怎麼辦呢。小B知道自己不是完全有信心,但是也只能硬著頭皮上了,畢竟小姐姐那麼看好自己,不能讓人家失望,就算顏面掃地也要賭一把。小B略作思考,回憶了一遍最開始學習Android的時候廣播方面的知識,廣播是獨立於context存在的一個神奇物種,瞬間一絲白光閃過,小B優(bi)雅(shi)地推開小A,說讓我來試試吧,啪啦啪啦三分鐘寫完,小B的程式碼如下:

Android程式保活方案

Android程式保活方案

小組成員紛紛朝小B程式碼看去,噢,原來小B是利用了程式被殺了廣播還能開啟的特性,在程式被殺以後開啟了廣播,然後廣播又開啟了service,這樣確實有一定可行性。小B將程式一執行ide裡就開始打log,然後小B深呼吸了一口氣,將程式殺掉,奇蹟出現了,ide里居然還在打Log!這說明了什麼,說明了小B做到了在使用者在工作列清除應用以後程式仍然存在。小姐姐緊張得不行,眼看著就要倒小B身上了。說時遲那時快,小C攔在了小B前面,說到,那如果使用者從設定裡強制殺掉程式呢,你這程式還能活著麼?人家微信可以做到了就算你在設定裡殺掉了程式依然能存活,你殺一個試試?小B有些擔心但是也只能厚著臉皮試試了,他有氣無力地進了設定裡強制把程式一殺,果然log停止了,停止了。。。

這個時候小C首先解釋了一番,說我們可以利用雙程式保活機制,使用者每次只能殺掉一個程式,我們在使用者殺掉其中一個的時候我們利用另一個程式來開啟剛剛被殺掉的程式,這樣就能做到程式保活了。小C說完新建了2個service,然後指定其中一個service在新開的程式中執行,將2個service互相繫結,最後加上系統的定時器JobService,每過100ms檢查我們的本地和遠端服務是否已開啟,如果沒有開啟的話重新開啟程式,小C的核心程式碼如下:

Android程式保活方案

Android程式保活方案

Android程式保活方案

程式碼執行起來以後,不論是調出應用管理來清除應用還是進入設定強制結束程式,那2個辛勤的service依然堅挺著,最終小C抱走產品小姐姐走向了人生巔峰。

但其實還是有很多限制的,首先JobService要求API>21,即5.0以上的手機才可以使用,其次各手機廠商對系統的修改程度不盡相同,導致有些手機上不是那麼好用也是可能的。程式保活肯定是系統想避免的,所以以後肯定會越來越難,如果不是特別有這種需求還是不要去嘗試,因為得不到大廠的支援就意味著產品的不穩定。再說我們也不希望安卓手機越來越卡,這對我們使用者和開發者來說都未必是好事。

最後:除了雙程式守護的方式,如果大家有用過其他的更好的程式保活的方式,歡迎一起探討!


相關文章