iOS 與其他操作系統(tǒng)有很多不同,當 App 不在當前運行時狈蚤,可以使用的資源特別有限寄纵。
雖說 App 傳統(tǒng)上講只有兩種狀態(tài)祟同,前臺和后臺随珠。但是這種說法是不太清晰的。
如果要清楚的講明白 App 在不同狀態(tài)下的異同點,那么可以從三個維度去看:
- 是否可見。App 是否顯示在屏幕上
- 能不能接收事件漂问,比如觸摸、搖晃手機等
- 能不能執(zhí)行代碼女揭。這個是我們比較關(guān)心的
App 的 5 中狀態(tài)
一個 App 蚤假,不管是處于什么情況下,總共的狀態(tài)有五種吧兔,分別是:
- 沒有運行狀態(tài)
- 活躍
- 不活躍
- 后臺運行
- 暫停運行
后面會詳細的講解某個狀態(tài)以及狀態(tài)之間的轉(zhuǎn)換磷仰。
非運行狀態(tài)
很多 App 都是這個狀態(tài),在此狀態(tài)下境蔼,設(shè)備的 RAM 中沒有加載該 App 的任何代碼芒划。
App 會長期地處于該中狀態(tài)。在這種狀態(tài)下欧穴,App 肯定是不會顯示在屏幕上的,并且也不能接受事件泵殴,當然也不能執(zhí)行代碼涮帘。簡單的理解為死掉的即可。
活躍狀態(tài)
當 App 在運行時笑诅,就是此種狀態(tài)调缨。
此時 App 可以接收事件疮鲫、運行代碼、顯示內(nèi)容弦叶。這種狀態(tài)即平時講的前臺運行俊犯。
非活躍狀態(tài)
App 在某些情況下,會進入到該狀態(tài)伤哺。
在這種狀態(tài)下燕侠,App 的內(nèi)容有顯示在屏幕上,并且能夠執(zhí)行代碼立莉,但是無法接收事件绢彤。
App 一般在下列情況下,會進入這個狀態(tài):
iOS 設(shè)備接收到 短信蜓耻、電話茫舶、通知等,也就是說對于用戶講刹淌,App 本身不是第一個被關(guān)注的內(nèi)容饶氏。
這種情況下,App 的內(nèi)容也顯示在屏幕上有勾,以一種模態(tài)的形式展現(xiàn)疹启。
后臺運行
當用戶使用 Home 鍵或者其他方式切換到另一個 App 或進入桌面后。App 將進入后臺運行模式柠衅。
無法顯示內(nèi)容皮仁,無法接收事件,但是能夠執(zhí)行代碼菲宴〈恚可執(zhí)行代碼的時間有限制。
一般來說喝峦,App 在后臺運行這個狀態(tài)可以長達 10 秒势誊,然后就會被系統(tǒng)調(diào)整到下一個狀態(tài),暫停狀態(tài)
暫停狀態(tài)
暫停狀態(tài)是 App 最多一個一個狀態(tài)谣蠢,表示 App 的一些相關(guān)數(shù)據(jù)仍存在于內(nèi)存中粟耻,但是 App 被懸掛起來,相當于 App 當時的狀態(tài)被封停了眉踱。
在這個狀態(tài)下挤忙,App 可以迅速的返回到活躍狀態(tài)。
如果長期處于這個狀態(tài)谈喳,并且系統(tǒng)在內(nèi)存不夠用時册烈,會將處于暫停狀態(tài)的 App 徹底殺死,轉(zhuǎn)換到非運行狀態(tài)婿禽。
用戶也可以通過手動殺死的方式赏僧,將 App 直接置于該種狀態(tài)大猛。
常見的狀態(tài)轉(zhuǎn)換
狀態(tài)之間是可以相互轉(zhuǎn)換的,下面簡述幾種常見的方式淀零。
當一個 App 在非運行狀態(tài)時挽绩,用戶可以通過點擊 App 的 Icon 或者 App 的通知來打開一個 App。
需要注意的是驾中,即使 silent 通知唉堪,在這種狀態(tài)下也是無法喚醒 App 的。
然后 App 進入到活躍狀態(tài)哀卫。
當用戶在使用 App 的過程中巨坊,會發(fā)生一些事件,然后 App 會進入非活躍狀態(tài)此改。比如:
收到一條短信趾撵、來電時。
收到一個到期的提醒事項時共啃。
收到一個通知占调,并且該通知是屬于那種彈出模式時。
用戶雙擊 Home 鍵移剪,進入到 App 切換界面究珊。
用戶一般不會在這個狀態(tài)下停留很久的時間,當阻礙 App 成為用戶第一焦點的其他消失或被用戶處理后纵苛,App 馬上恢復到活躍狀態(tài)剿涮。
用戶摁下 Home 鍵或者切換到別的 App 時,App 將進入到后臺運行狀態(tài)攻人,在這種狀態(tài)下取试,只能在有限的時間內(nèi)做一些簡單的工作,然后 App 將會休眠怀吻,進入到暫停狀態(tài)瞬浓。
在暫停狀態(tài)下,App 是什么都干不了的蓬坡,只能等待用戶主動喚醒或者 silent 通知猿棉。
休眠的 App 在收到 silent 通知時,將會進入后臺狀態(tài)屑咳,又可以在有限的時間內(nèi)做一些工作萨赁。
如果使用新聞類 App ,或者系統(tǒng)的郵箱服務時,可以發(fā)現(xiàn),有時候 App 明明沒有被打開過,但是在打開時,內(nèi)容已經(jīng)做了更新。
這里就用到了 silent 推送兆龙,App 接收到 silent 推送然后進入后臺運行模式杖爽,做網(wǎng)絡請求,得到數(shù)據(jù),然后更新 model掂林。這樣子用戶在下次打開 App 時,將會看到已經(jīng)更新好的數(shù)據(jù)坝橡,而不是再去做網(wǎng)絡請求泻帮,這樣子很好的提升了用戶體驗。
當 App 在休眠狀態(tài)太久计寇,并且更多的 App 進入到休眠狀態(tài)時锣杂,系統(tǒng)的內(nèi)容將不夠用,因為 App 在休眠時番宁,為了能夠快速的將其激活元莫,是將其放在內(nèi)存中的。
這樣子蝶押,用戶就感覺好像使用的 App 沒有被關(guān)閉踱蠢,一直在運行。
內(nèi)存不夠用時棋电,休眠時間比較長的 App 會被清退出內(nèi)存茎截,進入到非運行狀態(tài)。