ก่อนจะพูดถึงเรื่องอื่น ๆ ที่เกี่ยวกับการทำงานของ Task บนแอนดรอยด์ ขอคั่นด้วยการทำงานของ Home Screen และ Recent Screen กันก่อน เพราะทั้งคู่เป็นส่วนหนึ่งของระบบแอนดรอยด์และถูกเรียกใช้งานอยู่บ่อยครั้ง อีกทั้งยังส่งผลต่อการทำงานของ Task ในแอปแต่ละตัวอีกด้วย

บทความในชุดนี้

Home Screen

หลังจากที่ผู้ใช้ปลดล็อคหน้าจอแล้ว หน้า Home Screen จะเป็นหน้าแรกสุดของระบบแอนดรอยด์ที่ผู้ใช้จะได้พบเจออยู่เป็นประจำ โดยจะแสดงแอปและ Widget เพื่อให้ผู้ใช้สามารถใช้งานได้ง่าย และเปิดหน้า App Drawer เพื่อให้ผู้ใช้เห็นรายชื่อแอปที่มีทั้งหมดอยู่ในเครื่องได้ โดยแต่ละยี่ห้อและแต่ละเวอร์ชันก็จะมีหน้าตาแตกต่างกันออกไป (ขึ้นอยู่กับ Launcher App ที่ใช้)

สำหรับไอคอนแอปที่แสดงอยู่บน Home Screen จะมาจากการที่นักพัฒนากำหนดค่าไว้ใน Android Manifest

โดยภาพไอคอนและชื่อของแอปที่แสดงใน Home Screen จะมาจากการกำหนดค่าเหล่านี้ไว้ใน <application>

  • android:icon
  • android:roundIcon
  • android:label

และที่ Home Screen สามารถแสดงไอคอนของแอปได้ ก็มาจาก Activity ที่กำหนดค่า Intent Filter อยู่ 2 อย่างด้วยกัน

  • กำหนด <action> เป็น android.intent.action.MAIN
  • กำหนด <category> เป็น android.intent.category.LAUNCHER
<!-- AndroidManifest.xml -->
<manifest ...>
    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        ... >
        <activity ...>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- ... -->
    </application>
</manifest>

นั่นจึงเป็นเหตุผลว่าทำไมเวลาผู้ใช้กดเปิดแอปจาก Home Screen หรือ App Drawer แล้วจะแสดง Activity ตัวนั้นขึ้นมาเป็นตัวแรกสุด และ Activity ตัวดังกล่าวจะเรียกกันว่า Root Launcher Activity

นักพัฒนาสามารถกำหนด Intent Filter แบบนี้ให้กับ Activity มากกว่า 1 ตัวได้เช่นกัน แล้วใน App Drawer และ Home Screen ก็จะเห็นไอคอนของแอปตามจำนวน Activity ที่กำหนดไว้

แต่เราไม่ควรทำแบบนั้นเพราะผู้ใช้จะสับสนและไม่ประทับใจที่เห็นไอคอนของแอปเดียวกันมากกว่า 1 ตัวอยู่ใน App Drawer

เพราะจริง ๆ แล้ว Home Screen ก็เกิดมาจากแอปตัวหนึ่งในเครื่องที่เรียกกันว่า Launcher App ที่จะมีคำสั่งเพื่อค้นหาแอปทั้งหมดที่ติดตั้งอยู่ในเครื่อง แล้วแสดงไอคอนของแอปเฉพาะแอปที่กำหนด Intent Filter ไว้ใน Activity ตามที่อธิบายไว้ข้างบนนั่นเอง

และนักพัฒนาก็สามารถสร้างแอปให้ทำงานเป็น App Launcher เพื่อใช้แทน App Launcher ที่ติดตั้งมาในเครื่องตั้งแต่แรกได้เช่นกัน

Recents Screen

บ้างก็เรียกว่า Overview Screen หรือ Recents App

Recents Screen เป็น UI ส่วนหนึ่งของระบบแอนดรอยด์ที่มีหน้าที่แสดง Task ของแอปทั้งหมดที่ผู้ใช้เคยใช้งานไปในก่อนหน้านี้ โดยผู้ใช้สามารถกดเปิด Recents Screen ได้ตลอดเวลาเพื่อสลับไปมาระหว่าง Task ได้ง่าย

และที่ใช้คำว่า Task แทนที่จะเป็นแอป นั่นก็เพราะว่า Recents Screen บน Android 5.0 Lollipop ถูกออกแบบมาให้แสดงข้อมูลในรูปแบบของ Document-centric Model ทำให้แทนที่จะแสดงรายชื่อแอป ก็เปลี่ยนไปแสดงรายชื่อ Task แทน เพื่อให้รองรับกับแอปที่ทำงานแบบ Multiple Task ด้วย

ยกตัวอย่างเช่น แอป Google Chrome ที่แยก Task ตาม Tab Group ทำให้ผู้ใช้กดสลับไปมาระหว่าง Tab Group จาก Recents Screen ได้

และนอกจากนี้ เมื่อผู้ใช้ปัดแอปใน Recents Screen ออกไป ก็จะทำให้ระบบแอนดรอยด์ทำลาย Task นั้น ๆ ทิ้งให้ด้วยเช่นกัน

ทั้งคู่ส่งผลต่อ Task และ Activity Stack อย่างไร

เวลาที่ผู้ใช้กดเปิดแอปจาก Home Screen ถ้าแอปนั้นไม่เคยถูกเปิดขึ้นมาก่อน ระบบแอนดรอยด์ก็จะสร้าง Task ขึ้นมาพร้อมกับ Root Launcher Activity หรือถ้าแอปมี Task อยู่แล้วใน Background ก็จะเรียกขึ้นมาให้กลายเป็น Foreground แทน

และเมื่อแอปใช้คำสั่งเพื่อเปิด Activity พร้อมกับสร้าง Task ใหม่ ก็จะทำให้ Task นั้นถูกเพิ่มเข้าไปใน Recents Screen โดยทันที (สามารถกำหนดให้ Task ไม่แสดงใน Recents Screen ได้เช่นกัน)

และจากที่เคยอธิบายไปในบทความตอนที่แล้ว เมื่อผู้ใช้กดปุ่ม Home เพื่อออกจากแอปไป Home Screen หรือสลับแอปผ่าน Recents Screen จะทำให้ Task ที่เป็น Foreground เปลี่ยนสถานะเป็น Background แทน และส่งผลต่อ Activity Lifecycle ใน Task นั้น ๆ ด้วย

ถ้าไม่ต้องการให้ Task แสดงใน Recents Screen

ในบางครั้งนักพัฒนาก็อาจจะต้องการให้ Task บางตัวไม่แสดงใน Recents Screen ด้วยเหตุผลบางอย่าง ก็ให้กำหนดค่า android:excludeFromRecents="true" ให้กับ<activity> ใน Android Manifest แบบนี้ได้เลย

<!-- AndroidManifest.xml -->
<manifest ...>
    <application ... >
        <activity ...
            android:excludeFromRecents="true" />
        <!-- ... -->
    </application>
</manifest>

เมื่อ Activity ดังกล่าวถูกเปิดขึ้นมาใน Task ใด ก็จะทำให้ Task นั้น ๆ ถูกซ่อนออกไปจาก Recents Screen ในทันที

สรุป

จะเห็นว่าการทำงานของ Home Screen และ Recents Screen นั้น จะส่งผลต่อการทำงานของ Task ของแอปทุกตัว และการทำงานของ Recents Screen ก็จะส่งผลต่อการทำงานของแอปที่เป็น Concurrent Document ด้วย ซึ่งจะพูดถึงอีกทีในบทความ Task และ Back Stack ตอนที่ 8 - Multiple Task และ Concurrent Document

แหล่งข้อมูลอ้างอิง