為了節(jié)約電池的電量,智能手機上的操作系統(tǒng)的一個基本策略是,盡量減少正在運行的程序,這個道理很簡單,運行的程序越多,需要耗費的 CPU 計算時間就越多,電量就省不下來。下面的圖是蘋果 iOS 設(shè)備應(yīng)用程序調(diào)度狀態(tài)圖,事實上蘋果設(shè)備是除了用戶正在操作的程序,其他打開的程序進程盡可能都放到“掛起(Suspended)”的狀態(tài)下。在“掛起”的狀態(tài)下面,程序進程處在休眠狀態(tài),不耗費 CPU 計算能力。當(dāng)用戶沒有對設(shè)備進行操作的時候,整個系統(tǒng)處在休眠的低電狀態(tài)。(這里進程的意思是:程序運行實例)
智能手機上的 VOIP,作為一種多任務(wù)型的業(yè)務(wù),卻恰恰踩在耗電的雷區(qū)上。VOIP 類的應(yīng)用需要實現(xiàn)為多任務(wù)原因是需要維持應(yīng)用應(yīng)用與服務(wù)器之間的長期的網(wǎng)絡(luò)連接,當(dāng)網(wǎng)絡(luò)側(cè)的來電呼叫到達(dá)的時候,提示用戶進行接聽。因此程序有“長期存活”的“待機”需求,后臺長期存活的程序僅僅能處在“后臺(Background)”的狀態(tài)下面,這個狀態(tài)下的程序進程,需要耗費 CPU 計算能力和電量。為何叫做“多任務(wù)”型的業(yè)務(wù)呢,意思是由于此業(yè)務(wù)的存在,除了用戶交互的程序進程,還存在另外的“存活”進程。
下面描述的文字非開發(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ò)連接仍然是活動的。當(dāng)網(wǎng)絡(luò)連接有新的數(shù)據(jù)到達(dá)的時候,程序?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)。
總結(jié):在 iOS 實現(xiàn)的 VOIP 方案中,應(yīng)用進程可以看作兩部分,一部分是需要系統(tǒng)內(nèi)核看管的網(wǎng)絡(luò)連接和系統(tǒng)的定期喚醒服務(wù),另一部分是 VOIP 的程序邏輯,在 VOIP 的狀態(tài)下,后一部分被放到了低電的“掛起(Suspended)”狀態(tài),最少的使用了 CPU,因此可以達(dá)到省電的效果。
當(dāng)然,無論如何優(yōu)化,這種 VOIP 應(yīng)用相比起傳統(tǒng)語音實現(xiàn)來說仍然是耗電的,因為整個系統(tǒng)(智能手機的 AP 部分)不能休眠。在是傳統(tǒng)的非 VOIP 話音業(yè)務(wù)中,如果沒有來電和用戶操作,整個系統(tǒng)是休眠的,僅僅是基帶芯片(智能手機的 CP 部分)在工作,負(fù)責(zé)維護與電信運營商基站的連接,這無疑是最省電的一種工作方式。