Launch Mode
Task và Back Stack
Khi mở một ứng dụng, Android sẽ tạo ra một Task để chứa các Activity.
-
Task:
-
Về cơ bản, nó là một "vùng chứa" (container) bao gồm các Activity mà người dùng tương tác để hoàn thành một công việc nhất định. Mỗi Task tương ứng với một card trong màn hình đa nhiệm (Recent Apps)
-
Task khác App.
-
Một app có thể có nhiều Task
-
Một Task có thế chứa activity từ nhiều app (deeplink, intent)
-
-
-
Back Stack: Quản lí các Activity trong Task theo cấu trúc LIFO (Last In, First Out)
Launch Mode
-
standard(Mặc định)Luôn tạo instance mới
-
singleTopNếu Activity đang ở top -> reuse (gọi
onNewIntent())Nếu không thì tạo mới
-
singleTaskĐảm bảo chỉ có một instance trong Task.
Nếu đã tồn tại thì clear tất cả activity phía trên nó và gọi
onNewIntent() -
singleInstanceĐảm bảo chỉ có 1 instance trong Task
Nằm trong một Task riêng và đứng một mình
-
singleInstancePerTaskGiống
singleInstancenhưng có thể có nhiều task khác nhau chứa nó.
Note:
-
taskAffinityNếu chỉ khai báo launch mode là
singleInstancehoặcsingleInstancePerTaskcó thể là không đủ vì tất cả các Activity đều có chung mộttaskAffinity(là Application ID) nên nó sẽ vẫn chui vào Task hiện tại. Để nó thực sự tách ra Task mới thì cần định nghĩa mộttaskAffinitykhác biệt trong file Manifest. -
Intent Flags ghi đè Manifest
FLAG_ACTIVITY_NEW_TASK (kết hợp với
taskAffinity). Nếu có sẵn một Task nào đó cótaskAffinitynhư vậy thì nó sẽ nhé Activity vào Task đó, nếu không thì nó tạo Task mới -
allowTaskReparenting="true"Giả sử Activity bị một App khác (ví dụ: Gmail) gọi lên. Tạm thời nó đang phải ở nhờ trong Task của Gmail.
Nhưng nếu nó được set
allowTaskReparenting="true", thì ngay khi người dùng mở lại App gốc, Activity này sẽ lập tức "nhảy" từ Task của Gmail về lại Task của App gốc.