[Android] Tìm hiểu các LauchMode của Activity trong Android

Đăng bởi: Admin | Lượt xem: 1954 | Chuyên mục: Android

Trong bài viết này chúng ta sẽ cùng tìm hiểu về các LauchMode của Activity trong Android: standard, singleTop, singleTask, singleInstance, so sánh sự khác nhau giữa chúng và khi nào thì dùng loại LaunchMode nào.


Task trong Android

Trước khi tìm hiểu về Launch Mode Android thì chúng ta sẽ tìm hiểu trước thuật ngữ "Task" (nhiệm vụ)

Task về bản chất là 1 stack chứa các đối tượng của activity

Khi bật ứng dụng thì 1 task mới được tạo ra và nó là task gốc của ứng dụng

Android có thể giữ nhiều task cùng một thời điểm (background) và chỉ hiển thị một task duy nhất cho người dùng tương tác (foreground).

Bạn có thể nhấn và giữ nút "Home" để xem các danh sách task đang thực thi của thiết bị. Mỗi một task này đại diện cho một ứng dụng đã được bật và giữ ở background. Khi chúng ta click vào các task này thì thiết bị sẽ tiến hành mở ứng dụng tương ứng lên foreground cho chúng ta. Launch mode cho phép chúng ta khởi tạo activity mới hoặc gọi activty tương ứng với task đang thực thi của ứng dụng. Activity launch mode có 4 giá trị, và chúng ta thường khai báo trong file AndroidManifest.xml của ứng dụng:

<activity android:launchMode = ["standard" | "singleTop" | "singleTask" | "singleInstance"] ../>

"standard": là giá trị mặc định nếu chúng ta không khai báo launch mode cho activity. Và chúng ta chia 4 giá trị launch mode của activity thành 2 nhóm:

"standard & singleTop" dùng để khởi tạo nhiều đối tượng activity và các đối tượng này ở trong cùng một task.

"singleTask & singleInstance" thì đối tượng activity được khởi tạo theo pattern singleton (tham khảo : http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/). Khi activity được khởi tạo với launch mode này thì sẽ trở thành activity gốc của 1 task mới.

Android launchMode là một thứ rất quan trọng mà tất cả những nhà phát triển Android nên biết làm thế nào launchMode làm việc. Hầu hết những nhà phát triển Android (bao gồm cả tôi) nghĩ rằng chúng ta biết tại sao nó được sử dụng. Nó không chỉ được dùng cho Activity singleTask để ngăn chặn việc cùng một Activity nhưng được tạo lại 2 lần. Trong trường hợp này thì đúng. Nhưng chúng ta thực sự biết những gì sảy ra với các Activity khác trong Stack khi chúng ta gọi một Activity với singleTask? Đã có nhiều bài viết về vấn đề này. Nhưng tôi muốn làm một điều gì đó thật trực quan, để các bạn có thể hiểu ngay khi chỉ cần lướt qua. Tôi sẽ chỉ sử dụng launchMode trong AndroidManifest. Đầu tiên, các bạn xem 2 image này, để có thể dễ hiểu hơn:

  • màu xanh có nghĩa là một Activity mới
  • màu vàng có nghĩa là cùng một thể hiện Activity nhưng method onNewIntent() sẽ được gọi

launchMode = “singleTop” in Activity D

Ví dụ 1: 

Nếu bạn định nghĩa Activity D là singleTop trong AndroidManifest.xml. D sẽ không được tạo mới mà method onNewIntent() trên D sẽ được gọi.

Ví dụ 2:

Nếu bạn định nghĩa Activity D là singleTop trong AndroidManifest.xml. Một Activity mới sẽ được tạo.

Ví dụ 3:

Nếu bạn định nghĩa Activity D là singleTop trong AndroidManifest.xml. Nếu Activity D không ở trên cùng của Task thì một Activity D mới được tạo

launchMode = “singleTask” in Activity C

Ví dụ 1:

Bạn nhận thấy rằng Activity D bị destroyed() và method onNewIntent() trên Activity C được gọi.

Ví dụ 2:

Một thể hiện của Activity C được khỏi tạo

launchMode = “singleInstance” in Activity E

A,B,C,D nằm trên một task. E sẽ được tạo trong một Task khác. Đúng vậy! E là được tạo trong một Task mới.

Khởi động Activity F từ Activity D

Sau đây là kết quả:

E vẫn nằm trên 1 Task. A,B,C,D và F nằm trong 1 Task khác.

Tạo mới E 1 lần nữa

Activity E vẫn nằm trong 1 Task khác. Nếu ta bắt đầu nó lại lần nữa, method onNewIntent() trên Activity E sẽ được gọi thay vì việc tạo mới Activity.

launchMode = “standard” in Activity B

Chúng ta đều biết rằng đã có một Activity B trong Stack. Nhưng nó sẽ không được gọi. Thay vào đó một Activity B mới sẽ được khởi tạo

Kết luận

Hiểu về launch mode giúp bạn thiết kế và điều hướng các activity tốt hơn trong các trường hợp yêu cầu đặc biệt. Trong bài viết này chúng ta chỉ dừng lại ở việc thảo luận khai báo các launch mode trong file AndroidManifest. Ngoài ra, Android launch mode cũng có thể khai báo thông qua FLAG của intent như FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_SINGLE_TOP.

Cảm ơn các bạn đã đọc bài viết.

Chào thân ái và quyết thắng!

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Android

Học Kotlin cơ bản
Số bài học:
Lượt xem: 16950
Đăng bởi: Admin
Chuyên mục: Android

Học lập trình Flutter cơ bản
Số bài học:
Lượt xem: 54351
Đăng bởi: Admin
Chuyên mục: Android

Lập trình Android cơ bản
Số bài học:
Lượt xem: 21987
Đăng bởi: Admin
Chuyên mục: Android