Giải thích chi tiết về Launch Mode và Tasks trong Android

0
Dịch vụ dạy kèm gia sư lập trình

Android launch mode là một khái niệm khá trừu tượng và rất nhiều bạn developer nhầm lẫn. Nhiều khi bạn ấy chỉ chọn một giá trị config chạy được mà không hiểu bản chất vì sao.

Khi nào tạo mới một Activity, bạn sẽ phải thêm khai báo cấu hình trong AndroidManifest.xml. Trong đó có phần cấu hình launch mode. Kiểu như sau:

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

Như bạn thấy, Android có 4 chế độ launch mode:

  • Standard
  • SingleTop
  • SingleInstance
  • SingleTask

Nếu là người đã có kinh nghiệm đi phỏng vấn, chắc hẳn bạn sẽ nhận ra người ta rất hay hỏi về chủ đề này. Chủ yếu, người ta đặt ra câc tình huống kiểu như: Chuyện gì sẽ xảy ra nếu Activity B được khởi chạy từ Activity A với chế độ launch mode là singleTask?

Để hiểu chính xác về các chế độ launch mode trong android, bạn phải nắm được TASK trong android là gì? Android quản lý các instance của Activity theo stack như nào?

Do đó, bài viết này mình sẽ giải thích chi tiết về Task và các vận hành của chế độ launch mode như nào.

Task trong android là gì?

Theo tài liệu chính thức từ Android Developer:

A task is a collection of activities that users interact with when performing a certain job.Android Developer Official Document

Chúng ta hiểu đơn giản như sau: TASK giống như là một thùng chứa tất cả các instance của Activity. Một Task có thể có nhiều instance của nhiều activity, và cũng có thể có nhiều instance của cùng một Activity.

Về cơ bản, Android quản lý các Activity theo cơ chế LIFO của STACK ( “Vào trước – Ra sau”).  Các ứng dụng khác nhau sẽ tạo tương ứng các TASKs . Các TASK này tồn tại trong bộ nhớ ngay cả khi ứng dụng không bật trên màn hình.

Điều quan trong cuối cùng mà mình muốn bạn lưu tâm đó là một ứng dụng cũng có thể có nhiều TASKs.

Trạng thái của một Task

Một Task có thể có 2 trạng thái: Background hoặc Foreground.

Để dễ hình dung hơn, chúng ta sẽ cùng nhau xem xét ví dụ sau:

Giả sử ứng dụng A có 4 Activity và hiện nó đang chạy ở chế độ foreground (tức là đang tương tác trực tiếp với người dùng). Nếu bạn nhấn phím HOME, toàn bộ ứng dụng sẽ chuyển xuống chạy background. Những activity trong Task sẽ bị tạm dừng (trạng thái Stop trong activity lifecycle)

Sau đó, bạn lại mở ứng dụng B khác, bạn thao tác với một vài Acvitity trên ứng dụng B. Tại thời điểm này, Task của ứng dụng A vẫn còn trong bộ nhớ.

Khi bạn nhấm phím HOME lần nữa (hoặc đơn giản là bạn chuyển sang mở ứng dụng A), lúc này hệ thống lại đảo chiều. Task của ứng dụng B lại chuyển về trạng thái background, còn task của ứng dụng A quay trở lại trạng thái foreground, toàn bộ dữ liệu bạn nhập trước đó trên ứng dụng A vẫn được giữ nguyên.

Đây cũng chính là cách thức hoạt động của các Task, cũng đơn giản dễ hiểu phải không?

Tìm hiểu các chế độ Android Launch.

Sau khi bạn đã nắm rõ Task là gì và cơ chế hoạt động của nó, chúng ta sẽ chuyển sang phần tìm hiểu các chế độ android launch luôn và ngay nhé.

#Standard

Đây là chế độ mặc định. Nếu bạn không chọn bất kỳ chế độ nào khác cho Activity, chế độ này sẽ được chọn mặc định.

Với chế độ này, hệ thống sẽ luôn khởi tạo và chạy Activity mới trong Task, kể các activity đó đã được tạo và chạy được đó.

android launch mode standard

#SingleTop

Với chế độ này, Activity sẽ chỉ có duy nhất một instance trong Task và luôn ở trên đỉnh của task.

  • Nếu Activity đang ở trên đỉnh của Task, thì một instance mới sẽ không được tạo. Thay vào đó, hàm onNewIntent() sẽ được gọi để báo cho bạn biết.
  • Nếu Activity đó không ở trên đỉnh, thì một instance mới sẽ được tạo và đẩy lên đỉnh của task. Trong trường này, chế độ này sẽ hoạt động với chế độ standard.

Android launch mode - SingleTop

#SingleTask

Với chế độ này, đúng như tên gọi, sẽ chỉ có duy nhất một instance của Activity tồn tại trong Task.

Nếu một Activity được thiết lập ở chế độ SingleTask, một Task mới sẽ được tạo mỗi khi Activity này được tạo lần đầu tiên. Do đó, activity này sẽ là luôn là instance đầu tiên trong Task.

Lúc này có 2 trường hợp:

  • Nếu Activity đang ở trên đỉnh của Task, một instance chắc chắn sẽ không được tạo, thay vào đó sẽ gọi hàm onNewIntent() -> giống với chế độ SingleTop
  • Nếu Activity tồn tại trong task, nhưng không ở trên đỉnh. Lúc này, hệ thống sẽ pop toàn bộ các instance phía trên của Activity và instance của Activity sẽ ở trên đỉnh của task, đồng thời gọi hàm onNewIntent()

Android launch mode - SingleTask

# SingleInstance

Ở chế độ, sẽ chỉ có duy nhất một instance trong một task.

Với chế độ này, cách thức hoạt động giống với SingleTask ở chỗ là sẽ task mới sẽ được tạo và instance của Activity đó sẽ đặt ở root. Nhưng điểm khác duy nhất là  task mới chỉ chứa instance của activity mà không làm gì thêm cả (không gọi hàm onNewIntent()). Nếu một activity mới được chạy từ chế độ này thì nó sẽ được thực hiện trong một task riêng biệt.

Vì chỉ có duy nhất một instance trong task nên:

  • Nếu tồn tại một instance của Activity trong một task nào đó, onNewIntent() sẽ được gọi cho Activity đó.

SingleInstance mode

Một vài lưu ý nhỏ

Sự khác nhau giữa singleTask và singleInstance?

Trong SingleTask, một task sẽ được tạo mỗi khi Activity đặt ở chế độ này chạy lần đầu tiên. Và task mới này cũng có thể chứa các Activity khác nữa.

Trong singleInstance, một Task mới cũng được tạo nhưng không thể chứa Activity khác.

Trạng thái của task với android launch mode

Nếu một task có chứa Activity A được khai nào với chế độ SingleTask, và đang chạy ở trạng thái background. Lúc này, nếu một activity B nào đó đang chạy foreground mà gọi Activity A, điều gì sẽ xảy ra?

Toàn bộ Activity trong  Task chứa Activity A sẽ được đặt lên trên các activity trong Task chứa Activity B.

Android launch modes

Qua đây, mình hi vọng bạn đã hiểu rõ về các launch mode trong ứng dụng Android. Cá nhân mình cũng được “cứu giúp” fix được bug khó rất nhiều khi chỉ thay đổi cấu hình launch mode này.

👍 Đọc thêm các bài viết khác:

👍 Bài viết được tham khảo từ:

  • https://developer.android.com/guide/components/activities/tasks-and-back-stack
  • https://developer.android.com/guide/topics/manifest/activity-element
  • https://www.javacodegeeks.com/2020/09/android-launch-modes-and-tasks-explained.html
Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trước[React] Cách sử dụng useEffect() thay thế lifecycle method
Bài tiếp theoLàm thế nào ghép (concat) mảng trong Javascript?
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Thông báo