Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Người dùng nghe điện thoại, xoay màn hình, chuyển sang ứng dụng khác rồi quay lại. Mỗi hành động đó đều tác động tới màn hình ứng dụng của bạn. Hiểu vòng đời Activity giúp bạn biết khi nào nên khởi tạo, lưu và giải phóng tài nguyên.
Activity đại diện cho một màn hình có giao diện mà người dùng tương tác. Hệ điều hành Android quản lý nó và gọi các phương thức vòng đời tại từng thời điểm. Bạn ghi đè những phương thức này để chạy mã đúng lúc.
| Phương thức | Khi nào được gọi | Thường làm gì |
|---|---|---|
| onCreate | Activity được tạo | Dựng giao diện, khởi tạo biến |
| onStart | Activity sắp hiển thị | Chuẩn bị thứ cần cho giao diện |
| onResume | Đang ở phía trước, nhận tương tác | Bật cảm biến, camera, cập nhật |
| onPause | Mất tiêu điểm, có thể còn nhìn thấy | Tạm dừng thứ nhạy cảm, lưu nhanh |
| onStop | Không còn hiển thị | Giải phóng tài nguyên nặng |
| onDestroy | Bị hủy | Dọn dẹp cuối cùng |
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("Lifecycle", "onCreate")
}
override fun onStart() {
super.onStart()
Log.d("Lifecycle", "onStart")
}
override fun onResume() {
super.onResume()
Log.d("Lifecycle", "onResume")
}
override fun onPause() {
Log.d("Lifecycle", "onPause")
super.onPause()
}
}
Hãy thử in log như trên rồi xoay màn hình, bấm nút Home, mở lại ứng dụng. Quan sát thứ tự gọi là cách học nhanh nhất.
Mặc định, khi xoay màn hình hoặc đổi cấu hình (ngôn ngữ, chế độ tối), Android hủy rồi tạo lại Activity. Mọi biến trong Activity bị mất. Đó là lý do người mới hay thấy dữ liệu nhập dở biến mất sau khi xoay.
Dùng cho lượng nhỏ dữ liệu giao diện, như vị trí cuộn hoặc nội dung ô nhập:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("count", count)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
count = savedInstanceState?.getInt("count") ?: 0
}
ViewModel sống lâu hơn Activity qua các lần xoay màn hình, là nơi thích hợp giữ dữ liệu và logic xử lý. Dữ liệu trong ViewModel không bị mất khi Activity bị tạo lại.
class CounterViewModel : ViewModel() {
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count
fun increase() {
_count.value++
}
}
Lưu ý ViewModel không sống sót nếu hệ thống giết tiến trình khi thiếu bộ nhớ. Dữ liệu quan trọng cần lưu bền vững hoặc dùng SavedStateHandle.
Vòng đời là nền tảng của Android. Khi nhớ được thứ tự onCreate, onStart, onResume và cặp đối xứng khi rời đi, kết hợp với ViewModel, bạn sẽ tránh được hầu hết lỗi mất trạng thái. Dù dùng Compose thì các khái niệm này vẫn còn nguyên giá trị.
Cách tốt nhất để nhớ vòng đời là tự gây ra từng tình huống và quan sát log. Thử mở ứng dụng rồi bấm nút Home: bạn thấy onPause rồi onStop. Mở lại từ danh sách ứng dụng gần đây: onRestart, onStart, onResume. Thử mở một hộp thoại hay Activity trong suốt phía trên: ứng dụng chỉ nhận onPause mà chưa bị onStop vì vẫn còn nhìn thấy. Thử bật chế độ chia đôi màn hình hoặc cuộc gọi đến để thấy hành vi mất tiêu điểm.
Một thử nghiệm quan trọng là bật tùy chọn nhà phát triển "Không giữ hoạt động" (Don't keep activities). Khi bật, hệ thống hủy Activity ngay khi bạn rời khỏi nó, mô phỏng tình huống thiếu bộ nhớ. Nếu ứng dụng của bạn vẫn khôi phục đúng trạng thái khi quay lại, bạn đã xử lý lưu trạng thái đúng cách. Đây là bài kiểm tra mà nhiều ứng dụng trượt nhưng rất ít người nhớ làm.
Nếu cần một lộ trình học Android có hệ thống, hãy xem các khóa học tại codebem.com.
Nguyễn Đình Cường
0 comment