[Android] Lifecycle của Activity và Fragment
This post hasn't been updated for 2 years
Activity Lifecycle
Activity
là lớp cơ bản để xây dựng ứng dụng Android. Khi người dùng tương tác với ứng dụng, có thể có nhiều trường hợp xảy ra như: chuyển, đóng, ẩn, thay thế Activity
. Điều này sẽ tạo ra nhiều thay đổi về mặt trạng thái đối với Activity
mà người dùng vừa tương tác. Do đó ta được cung cấp một số callback nhằm phục vụ việc quản lí Activity
dễ dàng hơn hay còn được gọi là Activity Lifecycle.
Các trạng thái của Activity:
- Created
- Started
- Resumed
- Paused
- Stopped
- Destroyed
onCreate
Được gọi khi khởi tạo activity, lúc này người dùng vẫn chưa nhìn thấy và tương tác được với activity (trạng thái INITIALIZED
). Ta bắt buộc phải hiện thực phương thức này khi tạo activity:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Some thing
}
onCreate
là nơi ta thực hiện các thao tác:
- Bind data tới một list
- Init một vài biến thuộc class scope
- Lấy giá trị bundle được gửi tới thông qua intent
- Liên kết activty với ViewModel
- ...
Ngoài ra onCreate
có param là một bundle onCreate(savedInstanceState: Bundle?)
chứa giá trị liên quan đến trạng thái đã được lưu lần trước của activity (sẽ được nói đến ở các phần tiếp theo).
Khi thực hiện xong function onCreate
activity của chuyển sang trạng thái CREATED
.
onStart
Khi activity đi vào trạng thái STARTED
, onStart
sẽ được gọi nhằm mục đích chuẩn bị đưa activity lên foreground, hiển thị cho người dùng. Phương thức này được thược hiện rất nhanh và trong body của phương thức này, activity sẽ không giữ trạng thái STARTED
mà sẽ là CREATED
. Khi thực hiện xong, activity sẽ chuyển sang RESUMED
.
Một trong những chức năng thường được đặt ở onStart là preview, xem trước Camera.
onResume
Activity ở RESUMED
sẽ gọi callback onResume
. Ở trạng thái này người dùng có thể tương tác trực tiếp activity và RESUMED
sẽ được giữ cho đến khi có những thay đổi về mặt "focus" chẳng hạn như: người dùng chuyển đến activity khác, nhận được cuộc gọi, tắt màn hình.
onResume
có thể được gọi nhiều lần trong suốt chương trình:
- onCreate > onStart > onResume
- onPause > onResume
- onStop > onRestart > onStart > onResume
Thường được dùng để thực hiện các thao tác:
- Start camera preview
onPause
Khi onPause
được gọi là dấu hiệu cho biết người dùng đã "rời khỏi" activity (không có nghĩa là bị huỷ) hay nói cách khác là activity hiện tại đã bị event interrupts app execution bởi activity khác. Lúc này activity chuyển sang trạng thái PAUSED
.
Một số trường hợp khiến activity chuyển đến trạng thái này
- Một vào thao tác gây lỗi, treo ứng dụng
- Activity bị che khuất một phần bởi activity khác
Ở trạng thái PAUSED
này, ta thường sẽ xử lí các hoạt động để hoàn lại tại nguyên không sử dụng như GPS, NFC...
onStop
Được gọi khi activity không còn được nhìn thấy bởi user nữa có nghĩa là nó đã bị che lấp hoàn toàn. Xảy ra khi người dùng chuyển màn hình (activity), chuyển ứng dụng, bấm home.
onStop
thường được dùng để:
- Lữu trữ dữ liệu
- Cancel các job như gọi API, truy xuất dữ liệu local
- Giải phóng các tài nguyên sử dụng
onDestroy
Là lời gọi kết thúc cho một activity, thường dùng để giải phóng các tài nguyên (các phần mà onStop chưa xử lí).
onDestroy
sẽ được gọi khi:
- Người dùng kết thúc, dừng activty
- Gọi
finish()
trong activity - System gọi vì có thay đổi liên quan đến config như: xoay thiết bị hoặc bật multi wind
Kịch bản thực tế
- Khi mở ứng dụng khác từ thanh thông báo hoặc mở trong cài đặt: onPaused() –> onStop()
- Khi nhấn nút back từ ứng dụng khác hoặc cài đặt từ người dùng có thể nhìn thấy ứng dụng bạn: onRestart() –> onStart() –> onResume()
- Khi có một thông báo mở trong màn hình: onPause()
- Sau khi tắt thông báo hoặc nhấn nút back từ thông báo: onResume()
- Khi điện thoại đổ chuông và người dùng đang sử dụng ứng dụng:* onPause() –> onResume()*
- Khi người dùng nhấn nút trả lời trên điện thoại: onPause()
- Sau khi cuộc gọi kết thúc: onResume()
- Khi điện thoại tắt màn hình: onPaused() –> onStop()
- Khi màn hình được bật lại: onRestart() –> onStart() –> onResume()
- Khi bắt đầu mở ứng dụng: onCreate() –> onStart() –> onResume()
- Khi nhấn nút quay lại và thoát ứng dụng: onPaused() — > onStop() –> onDestory()
- Khi nhấn nút home: * onPaused() –> onStop()*
- Sau khi nhấn nút home và quay lại mở ứng dụng từ danh sách hoặc nhấp vào biểu tượng ứng dụng: onRestart() –> onStart() –> onResume()
Fragment Lifecycle
Tương tự như Activity, ở Fragment
cũng có các callback và trạng thái:
- onAttach: fragment được attach vào host activity.
- onCreate: luôn gọi sau khi fragment được attach, khởi đầu cho fragment
- onCreateView: khời tạo thành phần view và add nó vào activity
- onActivityCreated: activty thực thi xong onCreate
- onStart: fragment được hiển thị
- onResume: fragment hiển thị và tương tác được
- onPause: fragment không còn tương tác được, Xảy ra khi fragment sắp bị thay thế, xoá hoặc activty ở pause
- onStop: fragment không còn được hiển thị. Vì nó bị xoá, thay thế hoặc activty ở stop
- onDestroyView: view và tài nguyên tạo ra ở onCreateView bị xoá khỏi activty
- onDestroy: huỷ hoàn toàn fragment
- onDetach: detach fragment khỏi activity
Mối liên hệ
Lời kết
Trên là những khái niệm cũng như các cách sử dụng của activity life cycle và fragment life cycle. Bạn có thể tìm hiểu thêm: về activty và fragment.
Cảm ơn các bạn đã đọc bài viết.
Reference
All Rights Reserved