近日在網(wǎng)上看到一個文章,介紹 iPhone、Android 上的熱門的 VOIP 應(yīng)用 Viber,曰:“它可以完全運行在后臺,且不會耗電,即便是不運行在后臺,你照樣可以撥打免費電話和發(fā)免費短信!
應(yīng)該說,這些說法從技術(shù)上看并不嚴謹。首先,從這段文字能得到一個模糊的印象,一個在后臺運行的程序,并且不會耗電;其次,“程序即便是不運行在后臺,照樣可以撥打免費電話和發(fā)短信”,這如何理解呢?程序運行在前臺能否撥打免費電話?程序壓根不運行時能否撥打電話?

讓我們先看看智能手機上的電池電量限制與多任務(wù)需求的關(guān)系。
智能手機上電池電量限制與多任務(wù)需求
智能手機與桌面電腦的根本區(qū)別在于智能手機本身的硬件尺寸與電池電量大小,電池電量對智能手機來說是關(guān)鍵而致命的限制,人們要求手機越來越輕薄,功能越來越強大,然而待電時間卻要求越來越長,這不是“又要馬兒跑又要馬兒不吃草”的事情么!為此,智能手機上的電池電量正如沙漠中的水,一點一滴都不可以浪費。
為了節(jié)約電池的電量,智能手機上的操作系統(tǒng)的一個基本策略是,盡量減少正在運行的程序,這個道理很簡單,運行的程序越多,需要耗費的 CPU 計算時間就越多,電量就省不下來。下面的圖是蘋果 iOS 設(shè)備應(yīng)用程序調(diào)度狀態(tài)圖,事實上蘋果設(shè)備是除了用戶正在操作的程序,其他打開的程序進程盡可能都放到“掛起(Suspended)”的狀態(tài)下。在“掛起”的狀態(tài)下面,程序進程處在休眠狀態(tài),不耗費 CPU 計算能力。當用戶沒有對設(shè)備進行操作的時候,整個系統(tǒng)處在休眠的低電狀態(tài)。(這里進程的意思是:程序運行實例)

蘋果 iOS 設(shè)備的 VOIP 實現(xiàn)
正是由于對程序耗電量的錙銖必較,蘋果公司曾經(jīng)拒絕實現(xiàn)“真正”的多任務(wù),使用“快速程序切換”來緩解用戶對大部分“多任務(wù)”的需求,如今,相信蘋果的研發(fā)團隊是在做了艱難的平衡之后,決定允許部分業(yè)務(wù)實現(xiàn)為“多任務(wù)”。這些業(yè)務(wù)主要是上文提到的后臺的音樂播放、后臺的 GPS 定位服務(wù)、新聞訂閱業(yè)務(wù)的后臺定期更新、VOIP 應(yīng)用等等,并為后臺業(yè)務(wù)實現(xiàn)提供嚴格的開發(fā)指引。VOIP類的業(yè)務(wù)正是蘋果公司強制管理的一種“多任務(wù)”業(yè)務(wù),如果開發(fā)團隊不遵守架構(gòu)限制,軟件將不能通過審核和在蘋果應(yīng)用商城上發(fā)布,而 Viber,在 iOS 平臺上,應(yīng)該是遵循了該架構(gòu)。
讓我們來看看蘋果公司為VOIP實現(xiàn),這種架構(gòu)下如何可能達到省電的目標。
下面描述的文字非開發(fā)指引,僅僅為了幫助理解 VOIP 應(yīng)用進程的調(diào)度過程(需要一定的軟件開發(fā)背景來理解):
1、VOIP 應(yīng)用需要在 Info.plist 里配置 UIBackgroundModes 的值為 “VOIP” ,告知系統(tǒng),此乃 VOIP 應(yīng)用。
2、程序配置用于 VOIP 業(yè)務(wù)的網(wǎng)絡(luò)連接(Socket),告知系統(tǒng),在程序進程被調(diào)度到“掛起(Suspended)”狀態(tài)時該特殊的網(wǎng)絡(luò)連接需要被系統(tǒng)接管,因此,此時網(wǎng)絡(luò)連接仍然是活動的。當網(wǎng)絡(luò)連接有新的數(shù)據(jù)到達的時候,程序?qū)摹皰炱穑⊿uspended)” 狀態(tài)被喚醒到“后臺 (Background)”狀態(tài),如果是個來電事件,VOIP應(yīng)用則發(fā)起一個本地提醒事件,此時用戶可以在設(shè)備的界面上看到來電提醒,如果用戶選擇接聽來電,則 VOIP 應(yīng)用被調(diào)度到前端的“活動 (Active)”狀態(tài)直接與用戶交互,否則,回退到低電的“掛起(Suspended)”狀態(tài)。下圖可以看到左圖是傳統(tǒng)的 VOIP 應(yīng)用,在“待機”狀態(tài)下整個程序都運行在耗電的“后臺 (Background)”狀態(tài),右圖是蘋果的 VOIP 實現(xiàn),僅僅網(wǎng)絡(luò)連接運行在耗電的“后臺 (Background)”狀態(tài)。其余系統(tǒng)部分運行在低電的“掛起(Suspended)”狀態(tài)。


為何能夠更省電
然后,回到關(guān)于Viber的問題,如何“程序即便是不運行在后臺,照樣可以撥打免費電話和短信”?據(jù)考究,實際上應(yīng)為“即便程序不運行,照樣可以接聽電話和短信”。原因是,撥打電話和短信,肯定必須有用戶的交互操作,程序只能處在“活動(Active)狀態(tài)”,不可能是不運行的。根據(jù)Viber的網(wǎng)站的資料,Viber 使用了蘋果的 APNs(Apple Push Notification Service)功能,當用戶有電話撥入或者短信發(fā)送過來的時候,此時才加載 Viber 應(yīng)用。APNs 服務(wù)是一種 Apple 公司的網(wǎng)絡(luò)端服務(wù),用來向蘋果設(shè)備推送消息,通常也用來實現(xiàn)郵件推送等功能。

終極的省電方式
當然,無論如何優(yōu)化,這種 VOIP 應(yīng)用相比起傳統(tǒng)語音實現(xiàn)來說仍然是耗電的,因為整個系統(tǒng)(智能手機的 AP 部分)不能休眠。在是傳統(tǒng)的非 VOIP 話音業(yè)務(wù)中,如果沒有來電和用戶操作,整個系統(tǒng)是休眠的,僅僅是基帶芯片(智能手機的 CP 部分)在工作,負責維護與電信運營商基站的連接,這無疑是最省電的一種工作方式。
http://www.ifanr.com