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.
Nội dung chính của bài viết
Task trong android là gì?
Theo tài liệu chính thức từ Android Developer:
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 đó.
#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.
#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()
# 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 đó.
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.
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:
- Quy tắc đặt tên resource trong dự án Android
- Khóa học lập trình ứng dụng Android trong 24 giờ – FREE
- Xử lý JSON trong Android- Cách làm không thể dễ hơn
👍 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
Bình luận. Cùng nhau thảo luận nhé!