Đi nhanh qua Process và thành phần App
- Mặc định các thành phần app sẽ chạy trên Main Thread của 1 Process. Đọc thêm ở đây về Process và thread -> https://developer.android.com/guide/components/processes-and-threads.html
- Một ứng dụng có nhiều tiến trình (Foreground Process, Background Process…), mỗi tiến trình có thể chứa nhiều thành phần App (Activity, Service …), mỗi thành phần app sẽ có vòng đời riêng. Khi hệ thống thiếu bộ nhớ nó sẽ kill cái tiến trình nào có độ ưu tiên thấp nhất. Đọc thêm ở đây để biết thêm mối quan hệ giữa Activity và Process -> https://developer.android.com/guide/topics/processes/process-lifecycle.html
Tổng quan về Activity
- 1 App có nhiều Activity (bên cạnh đó còn có Services, Fragment, Loaders…) -> 1 Activity có 1 vòng đời -> 1 vòng đời có nhiều sự kiện như onCreate, onDestroy…
Dưới đây là Log vòng đời của Activity như sau:
1. Khi khởi động app:
onCreate
onStart
onResume
2. Khi ấn recent:
onPause
onSaveInstanceStateBundle[{}]
onStop
3. Khi mở lại ngay trong trạng thái Recent:
onRestart
onStart
onResume
4. Khi ra Home
onPause
onSaveInstanceStateBundle[{}]
onStop
=> Tương tự khi nhấn Recent để chuyển sang app khác hay chỉ muốn xem có những app nào đang chạy.
5. Khi mở lại app bằng recent:
onRestart
onStart
onResume
6. Khi mở lại app bằng chọn app trên màn hình thì giống với khi mở lại app bằng recent.
7. Khi tắt app bằng nút back:
onPause
onStop
onDestroy
8 Khi tắt app bằng Recent
onDestroy
9 Khi xoay màn hình.
onPause
onSaveInstanceStateBundle[{}]
onStop
onDestroy
onCreate
onStart
onRestoreInstanceStateBundle
onResume
10. Tắt màn hình tối đi (sleep) bằng nút nguồn
onPause
Trước khi gọi super onSaveInstanceState Bundle[{}]
Sau khi gọi super onSaveInstanceState Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@bea65d1, 2131427422=android.view.AbsSavedState$1@bea65d1, 2131427423=android.view.AbsSavedState$1@bea65d1, 2131427424=android.view.AbsSavedState$1@bea65d1, 2131427425=android.view.AbsSavedState$1@bea65d1}}]}]
onStop
11 Khi bật lại màn hình
onRestart
onStart
onResume
Khi lưu trạng thái cần chú ý:
– Có thể check trạng thái ở hàm onRestoreInstanceState (override nó)
– Có thể check trạng thái ở onCreate cũng được
– Để test 2 hàm onSaveInstanceState và onRestoreInstanceState chạy khi nào chỉ cần xoay màn hình.
– Luôn gọi super.onSaveInstanceState sau đó mới lưu State.
– Muốn lưu dữ liệu thường xuyên và tránh bị mất khi app crash nên dùng hàm onPause().
– onSaveInstanceState để lưu UI như EditText, CheckBox,…
Bài tập và đáp án
1) Activity (Sử dụng điện thoại Android để mô tả trạng thái vòng đời của Activity, nên dùng device thật)
(1.1) Khi ấn Home thì lifecycle của Activity thay đổi như thế nào?
=> Tạm dừng Foreground Process bằng onPause() để vào Background Process với onStop().
(1.2) Đang ở trong Activity mà có 1 app khác pop lên trên (ví dụ: có cuộc gọi tới) thì lifecyle của Acitivty thay đổi như thế nào?
=> sẽ vào chế độ Foreground Process bằng onPause() và khi popup tắt sẽ vẫn ở Foreground Process và gọi sự kiện onResume()
(1.3) Khi click back button thì vòng đời của Activity thay đổi như thế nào?
=> nếu chỉ còn 1 Activity thì sẽ xóa Activity đó khỏi stack và đóng app. Nếu có nhều Activity thì sẽ mở lại Activity trong stack.
(1.4) Khi giữ Home button -> recently app -> mở app: thì vòng đời của Activity thay đổi như thế nào?
(1.5) Trong vòng đời của Activity onStop() và onDestroy() có luôn được gọi không? Vì sao? Kể tên những trạng thái chắc chắn được gọi?
(1.6) Muốn save 1 giá trị nào đó (vào SharedPreference chẳng hạn) thì sẽ save trong vòng đời nào của Activity khi Activity bị hủy thì mới chắc chắn 100% save được?
=> trong onPause();
(1.7) onSaveInstance() dùng để làm gì? Viết demo. Tham khảo: link
=> Để lưu trạng thái ứng dụng như dữ liệu người dùng nhập vào. Ví dụ lúc xoay màn hình thì activity sẽ bị xóa khỏi bộ nhớ và tạo lại từ onCreate. Lúc xoay dữ liệu sẽ mất hoàn toàn.
(Chú ý: sử dụng onSaveInstance() rất quan trọng nên cần hiểu rõ và sử dụng thành thạo)
(1.8) Vẽ lại lifecycle của Activity.
(1.9) Viết demo sử dụng startActivityForResult(…), Viết ứng dụng start 1 Activity khác và lấy dữ liệu từ Activity đó.
(1.10) Khi Activity A start Activity B bằng startActivityForResult(..) sau đó B trả về data cho A thì lifecyle của Activity thay đổi như thế nào?
=> Activity đó sẽ vào chế độ (tiến trình) background bằng hàm onPause và onStop. Khi trở về nó sẽ trở lại Foreground theo trình tự onActivityResult -> onRestart -> onStart -> onResume. Xem lại phần bên trên ➹
Các bài viết không xem thì tiếc:
- Fragment và Activity trong android cơ bản
- Sử dụng canvas vẽ 2D transformation trong Android
- Cách dùng Eventbus để truyền dữ liệu trong Android
- Tổng quan nhất về ứng dụng Android
- Lập trình với Recyclerview trong Android – Bài 1 | dotrinh.com
- Truyền dữ liệu giữa 2 fragment trong android
- Lập trình phóng to thu nhỏ ảnh pinch in – pinch out trong Android
- Làm sao thiết kế nhiều màn hình trong Android
- KHÔNG CÀI ĐƯỢC APP TRONG ANDROID
- Process, Thread, Handler, AsyncTask cơ bản trong Android
- Chuyển một đối tượng sang Json trong Android
- Lập trình với Recyclerview trong Android – Bài 2 | dotrinh.com
- Build apk cho Android thông qua Wifi
- Truyền dữ liệu giữa các Activity trong android
- Tạo seekbar và kiến thức hữu ích về seekbar trong Android