VOIP 應(yīng)用是一種必須實(shí)現(xiàn)為“多任務(wù)”的業(yè)務(wù),這種業(yè)務(wù)通常是耗電的大戶。因此這段文字背后引出其中一個(gè)有趣的技術(shù)問(wèn)題,智能設(shè)備上的多任務(wù)的業(yè)務(wù)如何能夠“不會(huì)耗電”?
為了節(jié)約電池的電量,智能手機(jī)上的操作系統(tǒng)的一個(gè)基本策略是,盡量減少正在運(yùn)行的程序,這個(gè)道理很簡(jiǎn)單,運(yùn)行的程序越多,需要耗費(fèi)的 CPU 計(jì)算時(shí)間就越多,電量就省不下來(lái)。下面的圖是蘋(píng)果 iOS 設(shè)備應(yīng)用程序調(diào)度狀態(tài)圖,事實(shí)上蘋(píng)果設(shè)備是除了用戶正在操作的程序,其他打開(kāi)的程序進(jìn)程盡可能都放到“掛起(Suspended)”的狀態(tài)下。在“掛起”的狀態(tài)下面,程序進(jìn)程處在休眠狀態(tài),不耗費(fèi) CPU 計(jì)算能力。當(dāng)用戶沒(méi)有對(duì)設(shè)備進(jìn)行操作的時(shí)候,整個(gè)系統(tǒng)處在休眠的低電狀態(tài)。(這里進(jìn)程的意思是:程序運(yùn)行實(shí)例)
智能手機(jī)上的 VOIP,作為一種多任務(wù)型的業(yè)務(wù),卻恰恰踩在耗電的雷區(qū)上。VOIP 類的應(yīng)用需要實(shí)現(xiàn)為多任務(wù)原因是需要維持應(yīng)用應(yīng)用與服務(wù)器之間的長(zhǎng)期的網(wǎng)絡(luò)連接,當(dāng)網(wǎng)絡(luò)側(cè)的來(lái)電呼叫到達(dá)的時(shí)候,提示用戶進(jìn)行接聽(tīng)。因此程序有“長(zhǎng)期存活”的“待機(jī)”需求,后臺(tái)長(zhǎng)期存活的程序僅僅能處在“后臺(tái)(Background)”的狀態(tài)下面,這個(gè)狀態(tài)下的程序進(jìn)程,需要耗費(fèi) CPU 計(jì)算能力和電量。為何叫做“多任務(wù)”型的業(yè)務(wù)呢,意思是由于此業(yè)務(wù)的存在,除了用戶交互的程序進(jìn)程,還存在另外的“存活”進(jìn)程。
下面描述的文字非開(kāi)發(fā)指引,僅僅為了幫助理解 VOIP 應(yīng)用進(jìn)程的調(diào)度過(guò)程(需要一定的軟件開(kāi)發(fā)背景來(lái)理解):
1、VOIP 應(yīng)用需要在 Info.plist 里配置 UIBackgroundModes 的值為 “VOIP” ,告知系統(tǒng),此乃 VOIP 應(yīng)用。
2、程序配置用于 VOIP 業(yè)務(wù)的網(wǎng)絡(luò)連接(Socket),告知系統(tǒng),在程序進(jìn)程被調(diào)度到“掛起(Suspended)”狀態(tài)時(shí)該特殊的網(wǎng)絡(luò)連接需要被系統(tǒng)接管,因此,此時(shí)網(wǎng)絡(luò)連接仍然是活動(dòng)的。當(dāng)網(wǎng)絡(luò)連接有新的數(shù)據(jù)到達(dá)的時(shí)候,程序?qū)摹皰炱穑⊿uspended)” 狀態(tài)被喚醒到“后臺(tái) (Background)”狀態(tài),如果是個(gè)來(lái)電事件,VOIP應(yīng)用則發(fā)起一個(gè)本地提醒事件,此時(shí)用戶可以在設(shè)備的界面上看到來(lái)電提醒,如果用戶選擇接聽(tīng)來(lái)電,則 VOIP 應(yīng)用被調(diào)度到前端的“活動(dòng) (Active)”狀態(tài)直接與用戶交互,否則,回退到低電的“掛起(Suspended)”狀態(tài)。下圖可以看到左圖是傳統(tǒng)的 VOIP 應(yīng)用,在“待機(jī)”狀態(tài)下整個(gè)程序都運(yùn)行在耗電的“后臺(tái) (Background)”狀態(tài),右圖是蘋(píng)果的 VOIP 實(shí)現(xiàn),僅僅網(wǎng)絡(luò)連接運(yùn)行在耗電的“后臺(tái) (Background)”狀態(tài)。其余系統(tǒng)部分運(yùn)行在低電的“掛起(Suspended)”狀態(tài)。
總結(jié):在 iOS 實(shí)現(xiàn)的 VOIP 方案中,應(yīng)用進(jìn)程可以看作兩部分,一部分是需要系統(tǒng)內(nèi)核看管的網(wǎng)絡(luò)連接和系統(tǒng)的定期喚醒服務(wù),另一部分是 VOIP 的程序邏輯,在 VOIP 的狀態(tài)下,后一部分被放到了低電的“掛起(Suspended)”狀態(tài),最少的使用了 CPU,因此可以達(dá)到省電的效果。
當(dāng)然,無(wú)論如何優(yōu)化,這種 VOIP 應(yīng)用相比起傳統(tǒng)語(yǔ)音實(shí)現(xiàn)來(lái)說(shuō)仍然是耗電的,因?yàn)檎麄(gè)系統(tǒng)(智能手機(jī)的 AP 部分)不能休眠。在傳統(tǒng)的非 VOIP 話音業(yè)務(wù)中,如果沒(méi)有來(lái)電和用戶操作,整個(gè)系統(tǒng)是休眠的,僅僅是基帶芯片(智能手機(jī)的 CP 部分)在工作,負(fù)責(zé)維護(hù)與電信運(yùn)營(yíng)商基站的連接,這無(wú)疑是最省電的一種工作方式。