Android “launchMode”

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 actiivty 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 onNewInten() sẽ được gọi

launchMode = “singleTop” in Activity D

Ví Dụ 1: Nếu bạn định nghĩa Activity D như là singleTop trong AndroidManifest.xml. D sẽ không được tạo mới mà method onNewInten() trên D sẽ được gọi. Ví Dụ 2: Nếu bạn định nghĩa Activity D như 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 như 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. Vậy điều gì sẽ sảy ra nếu ta 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. 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

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. Và ở đâ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. 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 và FLAG_ACTIVITY_SINGLE_TOP.