[Android] Activity: Task and Back Stack

NH. Thanh
4 min readDec 13, 2019

--

Như tiêu đề, trong bài viết này thì mục tiêu hướng tới sẽ là hiểu về Task và Back Stack của Activity.

Task

Task (Tác vụ) là một tập hợp nhiều activity khi người dùng tương tác sắp xếp theo thứ tự khi thực hiện một công việc nào đó. Các activity này sắp xếp với nhau theo cơ chế “Ngăn xếp(Stack)”, tức nó có 1 thứ tự nhất định, ko thể sắp xêp lại, và tuân theo quy luật “Last in first out”. Khi người dùng bấm Home thì tất cả Activity đi vào trạng thái Pause và chạy background hoặc khi người dùng bấm back thì Activity hiện tại sẽ Finished và Activity trước đó trở lại trạng thái Resume.

Cơ chế thêm, xóa Activity trong 1 Task

Quản lý Task

Để quản lý task thì Android có cung cấp cho ta các cách để quản lý như sau

  • Manifest (Attribute của thẻ Activity)
    taskAffinity
    launchMode
    allowTaskReparenting
    clearTaskOnLaunch
    alwaysRetainTaskState
    finishOnTaskLaunch
  • Intent Flag
    FLAG_ACTIVITY_NEW_TASK
    FLAG_ACTIVITY_CLEAR_TOP
    FLAG_ACTIVITY_SINGLE_TOP

Trong các Attribute trên thì ta sẽ đi vào launchMode, và Intent Flag thì còn nhiều nhưng để quản lý task thì ta sẽ đi vào 3 Flag trên.

Sử dụng manifest.xml

Trong manifest.xml, khi khai báo thẻ <activity> thì để liên kết và quản lý với task, ta thêm thuộc tính android:launchMode, launchMode có 4 giá trị khác nhau mà bạn cần nắm rõ:

  • standard:
    Đây là mode default, sử dụng intent để thêm Activity vào một tác vụ hiện tại hoặc tác vụ khác, Activity có thể khởi tạo nhiều lần. Ví dụ: Activity A -> B -> C → C -> C, mỗi lần gọi intent sẽ thêm 1 Activity vào stack, và tuân theo nguyên lý như bình thường
  • singleTop
    Với singleTop, nếu một instance của Activity đang ở top của task hiện tại, thì khi gọi intent hệ thống sẽ đưa intent đó đến phương thức onNewIntent() của hàm, và không có sự thay đổi về số lượng Activity trong task. Nói dễ hiểu hơn, trong 1 tác vụ, nếu Instance của một Activity vừa gọi đang có trên top của tác vụ, thì hệ thống sẽ đưa intent của Activity đó vào hàm onNewIntent() . VD: Activity A -> B -> C (tại đây C đang là singleTop , tiếp tục gọi thêm 1 C) -> task vẫn là A->B->C (C ở đây đã cập nhật intent mới).
  • singleTask:
    Về singleTask, tại task hiện thời, nếu chưa có Instance của activity đó thì activity sẽ thêm vào task, tuy nhiên, nếu đã tồn tại Instance của activity này, nó sẽ đưa Instances activity đó lên đầu task hiện tại, và gọi hàm onNewIntent(). Các activity đứng trên top trước đó tức trên Instance của activity này sẽ bị hủy hết.
    VD: Activity A(singleTask)->B->C tại đây gọi là A thì A sẽ lên đầu task, bỏ qua B và C
  • singleInstance:
    Khi gọi thằng này, hệ thống sẽ cho Instance của Activity đó qua 1 task mới, nó sẽ là root của task mới đó, không chơi với ai, khi gọi Intent khác, thì no quay lại task còn lại và thêm Instance của activiti mới vào. Tuy nhiên nếu nó gọi bản thân nó thì sẽ vào onNewIntent().
    Ở đây nghĩa là : Task 1: A , Task 2: B C D . Task 2 đang ỏ foreground . Gọi A -> Task 1 lên foreground. Task 2 pause. khi Task 1 gọi B -> Task 2 foreground và trở thành: B C D B

Sử dụng Intent Flag

  • FLAG_ACTIVITY_NEW_TASK
    Khi gọi thằng cờ này thì giống như ta set singleTask vậy, nó tìm lại thằng Intance đã tồn tại của nó chuyển sang task mới và gọi onNewIntent() -> Lý thuyết là vậy, nhưng mà khi gắn vô thì nó lại vẫn sinh ra nhiều activity -> có thể cái này là bug của Android :D
  • FLAG_ACTIVITY_CLEAR_TOP
    Khi gọi cờ này thì nó sẽ tìm và resume Instance đã tồn tại của nó thông qua onNewIntent(), và hủy hết những Instance ở top
  • FLAG_ACTIVITY_SINGLE_TOP
    Cờ này tương tự như mode singleTop, nếu Instance nó đang ở top, thay vì tạo mới nó sẽ gọi onNewIntent().

Như vậy là xong phần quản lý task, nắm chắc nó bạn sẽ rất dễ dàng trong việc quản lý task của các Activity.

Bài viết dựa trên kiến thức và tìm hiểu cá nhân, mong mọi người phản hổi và đóng góp ý kiến để bài viết được hoàn thiện hơn. Thanks All.

Tham khảo:
https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=vi

--

--