iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

iOS 新手開發的大小事系列 第 26

Day 26: iOS App Life Cycle (生命週期)

  • 分享至 

  • xImage
  •  

前言

剛開始接觸 iOS 開發的時候,就對新專案一開始就給定的 viewDidLoad() 方法有一些疑問,經過詢問才知道要查關鍵字「生命週期」(life cycle),大部分文章都是談論 View Controller 的生命週期,其實 App 本身也是有生命週期,就把這兩種生命週期分開來談,今天主題是介紹 App 的生命週期,但因為 iOS 13 之後,蘋果改成 swiftUI 來開發,此篇文章是在更改前就已經完成的,所以只適用於 iOS 12 以下以及 Xcode 10 開新專案時看到的方法,詳細差異可參考官網


進入主題

每個 iOS 的 app 在它的生命週期皆有五種狀態。

  • Not running: 未運行狀態,app 還沒有被啟動過,或者已經被系統從暫停狀態清理掉了,此時 app 不會存在記憶體中。

  • Inactive: 未活躍狀態,app 正在運行並處於前台,但是無法接收任何事件,通常發生在狀態轉換的時期,而在這個狀態停留的時間一般都非常短暫,許多 app 都會使用一些畫面來渡過此階段。

  • Active: 活躍狀態,正在運行並處於前台,app 可以開始接收與回傳事件,UI 也可以開始運作,即是我們平常在用的 app。

  • Background: 後台運行狀態,程序處於後台並可以執行代碼(用戶切換到別的程序),當 app 進入後台後,iOS 只會留給程序很短暫的一點時間進行數據清理或保存工作,之後就會將程序進入暫停狀態。

  • Suspended: 暫停狀態,app 還活著,在後台且繼續佔有內存,但不會執行任何代碼,iOS 會保持這個狀態一段時間,以便快速響應用戶重新回到 app,但如果系統內存吃緊,就會優先殺掉這個狀態的進程。當下一次我們重新打開 app 時,app 就會重新回到後台運行狀態,再回到非啟動狀態,最後達到啟動狀態,進入可以使用的狀態。注意:系統從後台運行狀態轉到暫停狀態不會有任何通知。

下圖顯示與 app delegate object 有關的狀態切換,app 開啟後,系統會將 app 放在待用或背景的狀態中,取決於 UI (User Interface) 是否出現在螢幕上。當 app 啟動到前台時,系統會將 app 自動轉為活躍的狀態。至此之後,狀態在活躍與背景之間波動,直到 app 終止(適用 iOS 12 及以下版本)。

使用 app transitions 執行以下任務:

  • 在啟動時,初始化 app 的資料結構及 UI。
  • App 活化時,完成配置 UI 並準備與用戶互動。
  • App 停用後,保存數據並靜止 app 的行為。
  • 進入後台狀態後,完成關鍵任務、盡可能釋放內存,並準備 app 快照。
  • 終止時,立即停止所有的工作,並釋放所有共享的資源。

AppDelegate 扮演的角色

App delegate 是 app 的核心,它負責處理 app 的初始化、狀態的轉換和許多高階 app 的事件。此物件也是保證會出現在每一個 app,所以它通常用來設定 app 初始的資料結構。 App delegate 運用在整個 app 中,可以利用它來管理 app的生命週期,而 ViewController 則是用在單一的視圖。一個 app 可以有許多的視圖,但只會有一個 App delegate。


App delegate 各函數介紹

  • application: willFinishLaunchingWithOptions 程序正在被啟動,但還沒有到前台,可以在這裡做第一次的初始化動作,如檢查 options 等。

  • application:didFinishLaunchingWithOptions 程序已經完成系統初始化工作,但依然還沒有到前台,可以在這裡做最終的初始化動作;這兩個回調都是 app 被第一次觸發時才會回調的,其他從後台暫停到前台是不會觸發這兩個的。

  • applicationDidBecomeActive 已經處於活躍狀態,這裡就可以開始做事。

  • applicationWillResignActive 程序馬上就要進入後台。

  • applicationDidEnterBackground app 已經進入後台,並可能隨時會被暫停,做狀態保存吧;當然也可以在這裡請求延長後台任務的執行。

  • applicationWillEnterForeground 通知你程序馬上就要進入前台啦,但此時還不能響應事件,還不是活躍狀態,正在活躍狀態後會回調 applicationDidBecomeActive 方法,所以先在這裡恢復狀態吧。

  • applicationWillTerminate 程序將被殺掉(該回調只會在程序處於後台且非掛起的狀態下被殺掉),系統內存不足時,系統會殺掉後台的程序,在這裡做善後工作吧;而如果系統是殺掉的掛起的程序,則不會有任何通知;用戶主動殺掉進程的機制跟此類似。


上一篇
Day 25: 玩玩動畫 Animation
下一篇
Day 27: iOS View Controller Life Cycle (生命週期)
系列文
iOS 新手開發的大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言