Activity là 1 Component đặc biệt trong Android, có thể nói 1 ứng dụng gần như luôn luôn tồn tại tối thiểu 1 Activity (trường hợp ngoại lệ với những ứng dụng chạy dưới dạng Service). Chắc hẳn khi làm quen với Android các bạn đều được tiếp xúc qua những ví dụ "Hello Word" dạng hiển thị 1 TextView trên 1 Single Activity thông qua hàm setContentView() được gọi trong Callback onCreate() của Activity.
Activity cung cấp cho chúng ta 6 callback onCreate(), onStart(), onResume(), onPause(), onStop(), và onDestroy(), Callback ở đây là các hàm sẽ được gọi trong toàn bộ vòng đời của Activity.
Activity cung cấp cho chúng ta 6 callback onCreate(), onStart(), onResume(), onPause(), onStop(), và onDestroy(), Callback ở đây là các hàm sẽ được gọi trong toàn bộ vòng đời của Activity.
Hình trên đây quá quen thuộc khi bạn google search với keyword "Activity Lifecycle" vậy các trường hợp cụ thể khi nào các callback trên được gọi? Chúng ta sẽ cùng tìm hiểu thông qua các ví dụ sau:
Phần 1: Activities
Single Activity - Ứng dụng kết thúc và khởi chạy trở lại
Khi người dùng bấm Back Key Activity sẽ gọi finnish() toàn bộ dữ liệu của Activity sẽ được giải phóng, khi người dùng restart lại Activity sẽ được tạo mới
Phần 1: Activities
Single Activity - Ứng dụng kết thúc và khởi chạy trở lại
Khi người dùng bấm Back Key Activity sẽ gọi finnish() toàn bộ dữ liệu của Activity sẽ được giải phóng, khi người dùng restart lại Activity sẽ được tạo mới
Hình bên trên mô tả các callback sẽ được gọi ứng với trường hợp này. Với những bạn mới làm quen Android có thể sẽ chưa hiểu tại sao onCreate(null) được gọi với parameter là null
override fun onCreate(savedInstanceState: Bundle?)
Callback onCreate nhận vào 1 Bundle (Nó là 1 thằng để keep/storage dữ liệu giữa các Component, mình sẽ giải thích tại sao Android lại dùng thằng này trong bài sau)
Với trường hợp Activity start bởi User
Single Activity - Người dùng chuyển sang dùng ứng dụng khác
Trường hợp này cũng khá phổ biến khi User dùng App của chúng ta. Khác với bên trên là User nhấn Home Key hoặc chuyển sang dùng ứng dụng khác khi nhấn vào Notification của thiết bị. (ví dụ đang dùng app chúng ta xong có cuộc gọi tới người dùng chấp nhận cuộc gọi, đọc tin nhắn mới từ notification... )
override fun onCreate(savedInstanceState: Bundle?)
Callback onCreate nhận vào 1 Bundle (Nó là 1 thằng để keep/storage dữ liệu giữa các Component, mình sẽ giải thích tại sao Android lại dùng thằng này trong bài sau)
Với trường hợp Activity start bởi User
- Khi user click xong bạn gọi startActivity thì giá trị của savedInstanceState luôn luôn là null
- Khi người dùng đang dùng app bạn, sau đó nhấn Home Key và họ chuyển sang dùng Facebook, App Facebook cần nhiều memory quá giải pháp thiết bị đưa ra là giải phóng tạm thời các App khác, sau đó khi người dùng quay trở lại app của bạn, Activity sẽ được restart lại với giá trị savedInstanceState khác null
- Khi Configuration change ví dụ xoay màn hình, chuyển đổi ngôn ngữ của thiết bị, multi - window Activity của bạn cũng restart với savedInstanceState khác null (Tất nhiên là app bạn phải support rotate :D)
Single Activity - Người dùng chuyển sang dùng ứng dụng khác
Trường hợp này cũng khá phổ biến khi User dùng App của chúng ta. Khác với bên trên là User nhấn Home Key hoặc chuyển sang dùng ứng dụng khác khi nhấn vào Notification của thiết bị. (ví dụ đang dùng app chúng ta xong có cuộc gọi tới người dùng chấp nhận cuộc gọi, đọc tin nhắn mới từ notification... )
Về cơ bản Activity hiện tại của chúng ta vẫn tồn tại, nó rơi vào Stop chứ k hoàn toàn bị Destroy (Memory không được giải phóng). Với các trường hợp bình thường khi app restart Activity sẽ không create lại mà chỉ call giống như hình bên trên.
Tại sao onSaveInstanceState lại được gọi?. Bên trên mình có nói về ví dụ khi User đang dùng App chúng ta sau đó chuyển qua App Facebook (bằng Home Key hoặc Notification nếu nhấn Back thì quay lại trường hợp trên rồi), vì App Facebook có quá nhiều thông tin nên nó có thể sẽ ngốn nhiều memory của máy, Android đưa ra giải pháp là thay vì phải giữ lại toàn bộ Activity (View + State) thì chỉ giữ lại những thông tin cần thiết được Developer lưu lại trong hàm onSaveInstanceState, để khi người dùng quay lại dùng App nó sẽ gọi lại onCreate(Bundle) -> onStart -> onRestoreInstanceState -> onResume, Bundle sẽ chứa các thông tin chúng ta lưu lại (giả sử User đang thêm Bank Account, không lẽ bạn bắt User nhập lại các thông tin họ đã input :D)
Single Activity - Configuration thay đổi
Ví dụ điển hình nhất cho trường hợp này là User xoay màn hình, đang xem video chiều dọc họ xoay màn hình lại nhìn cho rõ hơn :D, multi-window ..., cái này mình sẽ không giải thích nhiều
Tại sao onSaveInstanceState lại được gọi?. Bên trên mình có nói về ví dụ khi User đang dùng App chúng ta sau đó chuyển qua App Facebook (bằng Home Key hoặc Notification nếu nhấn Back thì quay lại trường hợp trên rồi), vì App Facebook có quá nhiều thông tin nên nó có thể sẽ ngốn nhiều memory của máy, Android đưa ra giải pháp là thay vì phải giữ lại toàn bộ Activity (View + State) thì chỉ giữ lại những thông tin cần thiết được Developer lưu lại trong hàm onSaveInstanceState, để khi người dùng quay lại dùng App nó sẽ gọi lại onCreate(Bundle) -> onStart -> onRestoreInstanceState -> onResume, Bundle sẽ chứa các thông tin chúng ta lưu lại (giả sử User đang thêm Bank Account, không lẽ bạn bắt User nhập lại các thông tin họ đã input :D)
Single Activity - Configuration thay đổi
Ví dụ điển hình nhất cho trường hợp này là User xoay màn hình, đang xem video chiều dọc họ xoay màn hình lại nhìn cho rõ hơn :D, multi-window ..., cái này mình sẽ không giải thích nhiều
Single Activity - App bị dừng bởi System
Đây là ví dụ khá đặc biệt, bạn để ý các trường hợp bên trên hầu như theo sau onPause là onStop được call, với trường hợp này chỉ onPause được call thôi nhé.
Đây là ví dụ khá đặc biệt, bạn để ý các trường hợp bên trên hầu như theo sau onPause là onStop được call, với trường hợp này chỉ onPause được call thôi nhé.
- Khi ứng dụng khác che 1 phần App (Không phải toàn bộ nha) ví dụ dễ nhất là khi bạn xin quyền cho ứng dụng, cái Dialog đó không phải Dialog của App bạn
- Intent chooser ví dụ khi App mình muốn call mà thiết bị có nhiều App để handle cuộc gọi thì nó sẽ hiện 1 cái Dialog để chọn, Share dialog
Chú ý: Trường hợp này không áp dụng cho
- Dialog của App (Dialog, AlertDialog, DialogFragment) sẽ k gọi onPause
- Notification, khi kéo Notification Panel xuống thì sẽ không gọi onPause