真正的后臺是要付出代價的
再來說說Android。Android系統(tǒng)的運行方式是這樣的:當(dāng)你運行了一個應(yīng)用,就進(jìn)入了該應(yīng)用相應(yīng)的層面;當(dāng)你又運行了一個應(yīng)用時,就又進(jìn)入了這個應(yīng)用的層面。新的層覆蓋在舊的上面,相互疊加,周而復(fù)始。谷歌為開發(fā)者提供了7個API,來調(diào)整應(yīng)用層之間的切換和運行,它的用途主要是用來設(shè)置如何切換,以及切換后要做怎樣的操作。
當(dāng)新的層活動時,會疊加到下面的層上,下面的層就會凍結(jié),或者說是被掛起。新的層處于激活狀態(tài)。這時按返回鍵的話,所有不可見的層就全部被凍結(jié)。
在Android系統(tǒng)后臺凍結(jié)中的應(yīng)用
在后臺運行上,谷歌提供了兩種解決方案:
服務(wù)類(Service):
可為應(yīng)用提供一個內(nèi)容由程序自身決定的服務(wù),應(yīng)用可以將需要在后臺執(zhí)行的操作寫入服務(wù)中。當(dāng)這個應(yīng)用被切回后臺,它的所以活動都被凍結(jié)。但寫入服務(wù)的那些操作仍然可由系統(tǒng)繼續(xù)執(zhí)行。如QQ這樣,只運行該應(yīng)用的某個活動。
廣播接收類(Broadcast receiver):
它可以讓應(yīng)用在后臺完整運行,而不像服務(wù)類,只能運行某一部分活動。但前提是應(yīng)用必須給系統(tǒng)一個既定的運行時間和目標(biāo),當(dāng)應(yīng)用消耗完時間,或達(dá)成了目標(biāo)后,系統(tǒng)就會結(jié)束并凍結(jié)該應(yīng)用的所有活動。這個類普遍存在于鬧鐘和GPS類的應(yīng)用當(dāng)中。
當(dāng)然,這兩種類并不是隨便給予的,還是要有一定限制條件,在某種用途中可以指定分配服務(wù)類或廣播類。廣播類還會根據(jù)需求限制最大時間,從而防止被應(yīng)用隨意使用,造成系統(tǒng)拖慢。
理論上Android系統(tǒng)沒有運行程序的數(shù)量限制,只要內(nèi)存足夠,可以無限制的開啟任意多個應(yīng)用。最后,當(dāng)后臺中運行的應(yīng)用越來越多,運行內(nèi)存吃緊,系統(tǒng)便會強制結(jié)束凍結(jié)中的活動。優(yōu)先結(jié)束沒有服務(wù)類和廣播類的活動,其次是服務(wù)類,如果內(nèi)存還是不夠,最后就會結(jié)束廣播類的活動。
總結(jié):
從上面兩個系統(tǒng)的多任務(wù)的描述來看,IOS和Android都是支持多任務(wù)的,而且機制幾乎相同——大體上都是,前臺運行后臺掛,特殊情況有權(quán)限。
比較起來,Android系統(tǒng)給予應(yīng)用的特殊權(quán)限比IOS要多些(這也是為什么IOS用起來比較順滑的原因)。這還得說IOS有比較先進(jìn)的推送系統(tǒng),而Android就比較慚愧了。
所以為了讓更多活動及時的從后臺推送到前臺,Android就必須讓更多的應(yīng)用在后臺運行,也就需要占用更多的內(nèi)存和處理能力,自然需要付出更高的電力和更好的硬件作為代價。