Hi mọi người! :)) “Đã từ rất lâu rồi” mới ngồi viết blog lại thế này. Bao nhiêu năng lượng, nhiệt huyết lúc mới bắt đầu bay đi đâu mất, chỉ để lại lười biếng.
Hôm nay, mình quyết tâm type những dòng này thì cũng là do có một sự kiện inspired mình cực kì. Chuyện là nay đi uống bia tán dóc với đám bạn, ngồi một hồi thì đá qua chủ đề tech, rồi một hồi nữa lại tới vụ app life cycle iOS, mình với thằng bạn cũng cãi nhau chí choé vụ này, thằng nào cũng khẳng định mình đúng :3 Tất nhiên là vậy, vì đơn thuần thì bọn làm tech khá bảo thủ (cãi trước rồi tính tiếp đê :v), kiểu gì cũng cho là mình đúng. Mà kiểu vừa cãi mà vừa ngờ ngợ k biết mình có nhầm không. Thôi thì giờ quyết tâm take note lại một lần cho lần sau nhảy vô coi.
Vâng chủ đề hôm nay mình sẽ nói đến là iOS app life cycle. Trước hết thì nhìn chung trong cách iOS quản lý app (cụ thể là các apps đang chạy), một app sẽ có vài trạng thái như sau:
- Not running: thì sẽ là trạng thái lúc app không được bật, hoặc là bị terminated (có thể do user force hoặc do system).
- Active: là app đang chạy, có nghĩa là đang trên foreground, thì app vẫn nhận và xử lý events bình thường.
- Inactive: app vẫn ở trên foreground, nhưng lúc này app không thể xử lý events (có thể là bị chen ngang bởi một tác vào khác). Hoặc đây cũng là một trạng thái khi app transit từ foreground xuống background.
- Background: là lúc này app đã xuống background, nhưng vẫn có thể thực thi được một số tasks nếu có đăng ký background task với OS.
- Suspended: app ở background nhưng không thể thực thi được các tasks. Thường thì do chính system sẽ tự động đưa app về trạng thái này. Lúc này thì app vẫn còn trong memory.

Đại khái thì trong 1 life cycle của app chỉ có những trạng thái như trên. Trong app chúng ta cũng có các event tương ứng để được notify khi bắt đầu hay đã vào các trạng thái trên, các hàm được list trong file AppDelegate. Các trạng thái chuyển đổi qua lại được gọi là transition giữa các trạng thái.
Đi cụ thể hơn vào use-case của từng trạng thái trên khi user sử dụng, chúng ta sẽ có các bước như sau:
User launch app lên, app sẽ được chạy trên foreground, ngay sau đó app sẽ được nhảy vào trạng thái active. Trong lúc đang sử dụng app, thì có một số tác vụ khác chen ngang, ví dụ như có cuộc gọi đến, hoặc đơn giản hơn là khi user vuốt xuống notification center, hoặc vuốt lên control center, thì lúc này app sẽ rơi vào trạng thái inactive. Inactive cũng là trạng thái để transit từ active qua các trạng thái khác (xuống background hoặc là user quit app). Khi user bấm nút home để về màn hình chính, app sẽ xuống trạng thái background, vào sau một khoản thời gian ngắn, nếu app không xử lý bất cứ tác vụ gì thì sẽ được system tự động chuyển về trạng thái suspended (có thể hiểu là trạng thái đóng băng, vì app lúc này sẽ không nhận được bất cứ thông báo gì) mà không cần báo trước. Cơ chế này có thể hiểu là system làm vậy để nhường tài nguyên hệ thống cho các app đang tương tác với user ở foreground (ví dụ CPUs,..), cũng một phần để tiết kiệm pin vì lúc này user không cần làm việc với app. Xử lý tác vụ trong background ở đây có thể hiểu là app đăng ký background task với system để có thể chạy được dưới background, system sẽ cấp một khoản thời gian để task thực thi tác vụ đó, xem thêm tại đây.
Cuối cùng là trạng thái terminated, để app rơi vào trạng thái terminated thì sẽ có 2 tình huống:
- Một là user force quit bằng cách kill app trong multitasking.
- Hai là lúc app đang trong trạng thái suspended (vẫn còn được lưu trong memory), system có thể terminated app của chúng ta để nhường bộ nhớ cho các app khác ở foreground.
Một lưu ý đó là, khi app đã ở trong trạng suspended thì khi system terminate app thì app sẽ không nhận được bất cứ thông báo gì về việc này.
Trong thực tế, với một số app đơn giản thì sẽ cũng chẳng cần app phải được giữ trong memory (về suspended) khi cho app xuống background, mà khi app vừa xuống background sẽ terminate app ngay lập tức để trả lại memory cho system. Đối với trường hợp như vậy thì ta cần đăng ký một key UIApplicationExitsOnSuspend và set bằng YES trong file info.plist của app.
Tham khảo:
Mình xin cảm ơn các bạn đã dành thời gian để đọc hết những dòng mình viết ra. Hẹn mọi người vào bài viết sau. Nếu có bất cứ sai sót gì trong bài thì mọi người hãy comment để cho mình biết và chỉnh sửa nhé ❤