Vòng đời của ứng dụng di động xác định cách ứng dụng hoạt động khi khởi chạy, thu nhỏ, quay lại từ nền và đóng. Trong bài viết này, chúng ta sẽ tìm hiểu App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle và LifecycleOwner. Hiểu các quy trình này rất quan trọng để ngăn rò rỉ bộ nhớ, mất dữ liệu và hoạt động không chính xác của ứng dụng. Chi tiết hơn trong tài liệu chính thức của Android Activity Lifecycle.
Các điểm chính
Trước khi đi vào vòng đời của từng màn hình riêng lẻ, điều quan trọng là hiểu vòng đời của toàn bộ ứng dụng. Trong iOS, ứng dụng trải qua năm trạng thái: Not Running (không chạy), Inactive (trong nền, không nhận sự kiện), Active (hoạt động), Background (trong nền, mã đang thực thi) và Suspended (trong nền, mã tạm dừng). Các trạng thái này được quản lý trong AppDelegate thông qua các phương thức applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground và applicationWillTerminate.
Trong Android, tương đương là Application Lifecycle, được theo dõi qua interface Application.ActivityLifecycleCallbacks. Tuy nhiên, Android tập trung nhiều hơn vào vòng đời của một Activity — một màn hình ứng dụng riêng lẻ. Điều này là do một ứng dụng Android có thể bao gồm nhiều Activity, mỗi Activity có vòng đời riêng.
Cách tiếp cận hiện đại trong Android là sử dụng ProcessLifecycleOwner từ thư viện lifecycle-process. Nó cho phép theo dõi trạng thái của toàn bộ tiến trình mà không bị ràng buộc với một Activity cụ thể. Trong iOS, UISceneDelegate (từ iOS 13) hoặc AppDelegate được sử dụng để theo dõi trạng thái ứng dụng. SceneDelegate xử lý nhiều cửa sổ (multiwindow) trên iPad. Hiểu App Lifecycle đặc biệt quan trọng đối với IT Sectr khi phát triển ứng dụng có đồng bộ nền, phát trực tuyến và cuộc gọi VoIP.
Activity là thành phần cơ bản của ứng dụng Android, đại diện cho một màn hình. Activity có vòng đời được xác định rõ ràng do hệ điều hành quản lý để phản hồi các hành động của người dùng và sự kiện hệ thống (xoay màn hình, cuộc gọi đến, thiếu bộ nhớ).
| Phương thức | Mô tả | Việc cần làm |
|---|---|---|
| onCreate | Được gọi một lần khi Activity được tạo | Khởi tạo UI, findViewById, thiết lập ViewModel |
| onStart | Activity trở nên hiển thị | Bắt đầu hoạt ảnh, đăng ký BroadCastReceiver |
| onResume | Activity nhận được tiêu điểm đầu vào | Bắt đầu camera, cảm biến, hoạt ảnh |
| onPause | Activity mất tiêu điểm (hiển thị một phần) | Lưu bản nháp, dừng hoạt ảnh |
| onStop | Activity không hiển thị | Giải phóng tài nguyên, dừng cập nhật |
| onDestroy | Activity bị hủy | Dọn sạch tất cả tham chiếu, hủy đăng ký LiveData |
| onRestart | Được gọi trước onStart sau onStop | Khởi tạo lại |
Quan trọng: onSaveInstanceState được gọi trước onStop để lưu trạng thái tạm thời. Việc khôi phục diễn ra trong onCreate thông qua Bundle savedInstanceState hoặc qua SavedStateHandle trong ViewModel. Nếu không xử lý vòng đời đúng cách, ứng dụng sẽ mất tất cả dữ liệu chưa lưu khi xoay màn hình.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}
Trong Jetpack Compose, vòng đời của Activity không thay đổi, nhưng Compose cung cấp các công cụ bổ sung: Composition nhận biết vòng đời qua LifecycleOwner, các hiệu ứng LifecycleEventEffect và DisposableEffect để tự động dọn dẹp tài nguyên khi hủy.
Fragment trong Android sống bên trong Activity và có vòng đời riêng, một phần trùng với Activity nhưng thêm các phương thức mới. Fragment có thể được thêm, thay thế, xóa mà không hủy Activity, khiến chúng linh hoạt hơn nhưng cũng phức tạp hơn.
Các phương thức chính của Fragment Lifecycle: onAttach — Fragment được gắn vào Activity (gọi đầu tiên); onCreate — khởi tạo dữ liệu; onCreateView — tạo View; onViewCreated — View đã tạo, có thể cấu hình UI; onStart — Fragment hiển thị; onResume — Fragment trong tiêu điểm; onPause — Fragment mất tiêu điểm; onStop — Fragment không hiển thị; onDestroyView — View bị hủy; onDestroy — Fragment bị hủy; onDetach — Fragment tách khỏi Activity.
Sự khác biệt chính so với Activity: onCreateView và onDestroyView có thể được gọi nhiều lần (ví dụ: khi chuyển TabLayout), trong khi onCreate chỉ được gọi một lần. Do đó, việc khởi tạo View nên được thực hiện trong onViewCreated, không phải trong onCreateView. Các tài nguyên liên quan đến View (như bộ điều hợp RecyclerView) nên được dọn dẹp trong onDestroyView.
UIViewController là lớp cơ sở để quản lý màn hình trong iOS. Vòng đời của nó bao gồm một chuỗi các phương thức mà UIKit tự động gọi. Hiểu chu kỳ này rất quan trọng cho việc khởi tạo UI, quản lý dữ liệu và bộ nhớ đúng cách.
| Phương thức | Khi được gọi | Sử dụng điển hình |
|---|---|---|
| loadView | Khi View Controller tải hệ phân cấp View | Khởi tạo tùy chỉnh không dùng storyboard |
| viewDidLoad | Sau khi View được tải vào bộ nhớ (một lần) | Thiết lập UI, tải dữ liệu ban đầu |
| viewWillAppear | Trước khi View xuất hiện trên màn hình | Cập nhật dữ liệu, đăng ký thông báo |
| viewDidAppear | Sau khi View xuất hiện trên màn hình | Bắt đầu hoạt ảnh, bắt đầu hoạt ảnh theo dõi |
| viewWillDisappear | Trước khi View biến mất khỏi màn hình | Lưu trạng thái, hủy đăng ký thông báo |
| viewDidDisappear | Sau khi View biến mất khỏi màn hình | Dừng hoạt ảnh, giải phóng tài nguyên |
| dealloc | Khi View Controller bị hủy | Giải phóng tất cả tài nguyên |
Quan trọng: viewDidLoad chỉ được gọi một lần trong vòng đời của View Controller. Để cập nhật dữ liệu mỗi lần xuất hiện, hãy sử dụng viewWillAppear. Nếu bạn đăng ký NotificationCenter trong viewWillAppear, hãy nhớ hủy đăng ký trong viewDidDisappear để tránh rò rỉ bộ nhớ.
SwiftUI quản lý vòng đời của View thông qua cấu trúc View. Thay vì các phương thức callback, SwiftUI sử dụng các bổ từ onAppear và onDisappear. Cho các trạng thái ứng dụng toàn cục, App Lifecycle được sử dụng thông qua các giao thức App và Scene. SwiftUI tự động quản lý việc tạo và hủy View dựa trên trạng thái, giúp đơn giản hóa phát triển nhưng yêu cầu hiểu về danh tính và thời gian sống của View.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}
LifecycleOwner là một interface từ Android Architecture Components đánh dấu một đối tượng có vòng đời (Activity, Fragment). LifecycleObserver là một interface cho phép một đối tượng đăng ký sự kiện của LifecycleOwner. Cùng nhau, chúng tạo nên nền tảng của quản lý vòng đời phản ứng trong phát triển Android hiện đại.
Thay vì gọi phương thức một cách tường minh trong onStart/onStop, nên sử dụng DefaultLifecycleObserver (thay thế cho LifecycleObserver cũ với chú thích @OnLifecycleEvent). Đây là cách tiếp cận được Google khuyến nghị cho ViewModel và các thành phần khác cần phản ứng với vòng đời mà không có tham chiếu trực tiếp đến Activity hoặc Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}
Tại IT Sectr, chúng tôi sử dụng LifecycleOwner trong tất cả các dự án Android. ViewModel đăng ký LifecycleOwner của Activity thông qua viewModelScope và lifecycleScope, đảm bảo tự động hủy coroutine khi Activity bị hủy. Điều này ngăn rò rỉ bộ nhớ và làm cho mã sạch hơn và an toàn hơn.
Câu hỏi thường gặp
Activity trải qua sáu trạng thái: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Thứ tự: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad được gọi một lần.
LifecycleOwner là một thành phần của Android Architecture Components sở hữu vòng đời của Activity hoặc Fragment. Cho phép đăng ký sự kiện qua LifecycleObserver.
Ứng dụng iOS trải qua năm trạng thái: Not Running, Inactive, Active, Background, Suspended. Các chuyển đổi được quản lý qua UIApplicationDelegate.
Saved State là cơ chế của Android để bảo toàn trạng thái Activity/Fragment khi xoay màn hình hoặc tạo lại tiến trình. Nó sử dụng onSaveInstanceState và SavedStateHandle.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.