งาน คือคอลเล็กชันกิจกรรมที่ผู้ใช้โต้ตอบด้วยเมื่อพยายาม ทำอะไรสักอย่างในแอป กิจกรรมเหล่านี้จะจัดเรียงเป็นกลุ่มที่เรียกว่า back Stack ตามลำดับการเปิดแต่ละกิจกรรม
เช่น แอปอีเมล อาจมีกิจกรรม 1 รายการเพื่อแสดงรายการข้อความใหม่ เมื่อผู้ใช้เลือก กิจกรรมใหม่จะเปิดขึ้นเพื่อดูข้อความนั้น เพิ่มกิจกรรมใหม่นี้แล้ว ไว้ในกองหลัง จากนั้น เมื่อผู้ใช้แตะหรือท่าทางสัมผัส "กลับ" กิจกรรมใหม่ดังกล่าว เสร็จสิ้นแล้วและหลุดออกจากกองซ้อน
วงจรของงานและสแต็กด้านหลัง
หน้าจอหลักของอุปกรณ์คือจุดเริ่มต้นสำหรับงานส่วนใหญ่ เมื่อผู้ใช้แตะ ไอคอนสำหรับแอปหรือทางลัดในตัวเปิดแอปหรือในหน้าจอหลัก ให้แอปพลิเคชันนั้นอยู่เบื้องหน้า หากแอปไม่มีงาน ระบบจะดำเนินการ ระบบจะสร้างงานใหม่และ กิจกรรมของแอปนั้นเปิดขึ้น เป็นกิจกรรมรากในกลุ่ม
เมื่อกิจกรรมปัจจุบันเริ่มอีกกิจกรรมหนึ่ง ระบบจะพุชกิจกรรมใหม่ไว้ที่ด้านบนสุด ของกองซ้อนและให้ความสำคัญ กิจกรรมก่อนหน้าจะยังคงอยู่ในกอง แต่ หยุดแล้ว เมื่อกิจกรรมหยุดลง ระบบจะรักษาสถานะปัจจุบันของกิจกรรมไว้ ของอินเทอร์เฟซผู้ใช้ เมื่อผู้ใช้ดำเนินการย้อนกลับ กิจกรรมปัจจุบันจะเป็น เด้งออกมาจากกองซ้อนและทำลายแล้ว กิจกรรมก่อนหน้าจะกลับมาทำงานอีกครั้ง และระบบจะคืนค่าสถานะก่อนหน้าของ UI
กิจกรรมใน กองซ้อนจะไม่จัดเรียงใหม่ แต่จะพุชเข้าไปใหม่และดึงออกจากกองตามเดิมเท่านั้น เริ่มต้นโดยกิจกรรมปัจจุบันและผู้ใช้ปิดไป ผ่านปุ่มย้อนกลับหรือท่าทางสัมผัส ดังนั้น Back Stack จึงทำงานเป็น โครงสร้างออบเจ็กต์ที่สุดท้ายก่อนสิ้นสุด รูปที่ 1 แสดงลำดับเวลาที่มี กิจกรรมที่ถูกผลักเข้าและถูกดึงขึ้นมาจากกองหลัง
![](https://developer.android.com/static/images/fundamentals/diagram_backstack.png?authuser=4&hl=th)
ขณะที่ผู้ใช้ยังคงแตะหรือทำท่าทางสัมผัส "กลับ" แต่ละกิจกรรมในกองซ้อน ถูกดึงเพื่อแสดงข้อความก่อนหน้า จนกว่าผู้ใช้จะกลับไปที่หน้าแรก หรือกิจกรรมใดๆ ที่ทำงานอยู่เมื่องานเริ่มต้นขึ้น เมื่อทั้งหมด ระบบจะนำกิจกรรมออกจากสแต็ก ไม่มีงานนี้แล้ว
ลักษณะการทำงานของการแตะย้อนกลับสำหรับกิจกรรมของตัวเรียกใช้งานรูท
กิจกรรม Launcher รูทคือกิจกรรมที่ประกาศความตั้งใจ
กรองโดยใช้ทั้ง 2 แบบ
ACTION_MAIN
และ
CATEGORY_LAUNCHER
กิจกรรมเหล่านี้ไม่ซ้ำกัน เนื่องจากทำหน้าที่เป็นจุดแรกเข้าของแอปจาก
ตัวเปิดแอปและใช้เพื่อเริ่มต้นงาน
เมื่อผู้ใช้แตะหรือท่าทางสัมผัส "ย้อนกลับจากกิจกรรมตัวเรียกใช้งานรูท" ระบบจะ จะจัดการกับกิจกรรมแตกต่างกันไป โดยขึ้นอยู่กับเวอร์ชันของ Android ที่ อุปกรณ์กำลังทำงาน
- ลักษณะการทำงานของระบบใน Android 11 และต่ำกว่า
- ระบบทำกิจกรรมจนเสร็จสิ้น
- ลักษณะการทำงานของระบบใน Android 12 ขึ้นไป
ระบบจะย้ายกิจกรรมและงานไปยังพื้นหลัง ทำกิจกรรมให้เสร็จ ลักษณะการทำงานนี้จะตรงกับลักษณะการทำงานเริ่มต้นของระบบเมื่อ การออกจากแอปโดยใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส
ในกรณีส่วนใหญ่ ลักษณะการทำงานนี้หมายความว่าผู้ใช้สามารถกลับมาใช้งานแอปของคุณอีกครั้งได้เร็วขึ้น จากสถานะที่อบอุ่นแทนที่จะเป็น โดยต้องรีสตาร์ทแอปโดยสมบูรณ์จากCold
หากคุณต้องการระบุการนำทางกลับที่กำหนดเอง เราขอแนะนําให้ใช้ AndroidX Activity API แทนการลบล้าง
onBackPressed()
API กิจกรรม AndroidX จะเลื่อนไปตาม ลักษณะการทำงานที่เหมาะสมของระบบหากไม่มีองค์ประกอบที่ขัดขวางระบบ แตะด้านหลังอย่างไรก็ตาม หากแอปลบล้าง
onBackPressed()
เพื่อจัดการ การนำทาง "ย้อนกลับ" และทำกิจกรรมให้เสร็จสิ้น อัปเดตการใช้งานเพื่อโทร ไปจนถึงsuper.onBackPressed()
แทนที่จะดูจนจบ การโทรsuper.onBackPressed()
ย้ายกิจกรรมและงานไปยังพื้นหลังเมื่อ ที่เหมาะสมและมอบประสบการณ์การนำทางที่สอดคล้องกันมากขึ้นสำหรับผู้ใช้ ข้ามแอป
งานในเบื้องหลังและงานเบื้องหน้า
![](https://developer.android.com/static/images/fundamentals/diagram_multitasking.png?authuser=4&hl=th)
งานคือหน่วยที่สอดคล้องกันที่สามารถย้ายไปยังพื้นหลังเมื่อผู้ใช้เริ่มต้น งานใหม่หรือไปที่หน้าจอหลัก กิจกรรมทั้งหมดในเบื้องหลัง ในงานถูกหยุด แต่ Back Stack สำหรับงานจะยังคงเดิม - งาน โฟกัสจะหายไปในขณะที่มีงานอื่นเกิดขึ้น ดังที่แสดงในรูปที่ 2 ต งานนั้นจะกลับไปที่เบื้องหน้า เพื่อให้ผู้ใช้เลือกต่อจากจุดที่ค้างไว้ได้ ปิดอยู่
พิจารณาโฟลว์งานต่อไปนี้สำหรับงานปัจจุบัน A ที่ มี 3 กิจกรรมในกลุ่มโดยมี 2 กิจกรรมอยู่ในกิจกรรมปัจจุบัน ดังนี้
ผู้ใช้ใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส จากนั้นเริ่มแอปใหม่จาก เครื่องเรียกใช้งานแอป
เมื่อหน้าจอหลักปรากฏขึ้น งาน ก จะเข้าสู่พื้นหลัง เมื่อมีการเปิดตัว แอปเริ่มทำงาน ระบบจะเริ่มงานสำหรับแอปนั้น (งาน ข) ด้วยสแต็กของตัวเอง ของกิจกรรม
หลังจากที่โต้ตอบกับแอปนั้นแล้ว ผู้ใช้จะกลับมาที่หน้าแรกอีกครั้งและเลือก แอปที่เริ่มต้นงาน A ในตอนแรก
ตอนนี้งาน A จะมาอยู่ที่เบื้องหน้าแล้ว โดยกิจกรรมทั้ง 3 อย่างในสแต็กมีดังนี้ ยังคงอยู่ และกิจกรรมที่ด้านบนของสแต็กจะกลับมาทำงานอีกครั้ง ในจุดนี้ ฟิลด์ ผู้ใช้ยังสลับกลับไปที่งาน ข. ได้โดยไปที่หน้าแรกและเลือกไอคอนแอป ที่เริ่มต้นงานนั้นหรือเลือกงานของแอปจากรายการล่าสุด หน้าจอ
กิจกรรมหลายรายการ
![](https://developer.android.com/static/images/fundamentals/diagram_multiple_instances.png?authuser=4&hl=th)
เนื่องจากกิจกรรมในสแต็กด้านหลังจะไม่มีการจัดเรียงใหม่ หากแอปของคุณ ช่วยให้ผู้ใช้เริ่มต้นกิจกรรมที่ต้องการจากกิจกรรมมากกว่า 1 กิจกรรม อินสแตนซ์ของกิจกรรมนั้น และพุชไปยังสแต็ก ทำให้กิจกรรมก่อนหน้านี้แสดงอยู่ที่ด้านบน ดังนั้น กิจกรรมในแอปของคุณอาจมีการสร้างอินสแตนซ์หลายครั้ง แม้จะมาจาก งานดังที่แสดงในรูปที่ 3
หากผู้ใช้ย้อนกลับโดยใช้ตัวเลือก "กลับ" ปุ่มหรือท่าทางสัมผัส อินสแตนซ์ของกิจกรรมจะแสดงตามลำดับ โดยแต่ละรายการจะมีสถานะ UI ของตนเอง อย่างไรก็ตาม คุณสามารถแก้ไข หากคุณไม่ต้องการให้มีการสร้างอินสแตนซ์กิจกรรมมากกว่า 1 ครั้ง ดูข้อมูล เพิ่มเติมเกี่ยวกับเรื่องนี้ในหัวข้อเกี่ยวกับการจัดการ Tasks
สภาพแวดล้อมแบบหลายหน้าต่าง
เมื่อแอปทำงานพร้อมกันในหลายหน้าต่าง สภาพแวดล้อม ที่รองรับใน Android 7.0 (API 24) ขึ้นไป ระบบจะจัดการงานแยกกันสำหรับแต่ละหน้าต่าง ชิ้น สามารถมีงานได้หลายรายการ เช่นเดียวกันกับแอป Android ที่ทำงานบน Chromebook: ระบบการจัดการงานหรือกลุ่มงานใน ต่อหน้าต่าง
สรุปวงจร
หากต้องการสรุปลักษณะการทำงานเริ่มต้นสำหรับกิจกรรมและงาน ให้ทำดังนี้
เมื่อกิจกรรม A เริ่มกิจกรรม B กิจกรรม A จะหยุดลง แต่ระบบ สถานะต่างๆ เช่น ตำแหน่งการเลื่อนและข้อความที่ป้อนลงในแบบฟอร์มจะยังคงเดิม ถ้า ผู้ใช้แตะหรือใช้ท่าทางสัมผัสย้อนกลับขณะอยู่ในกิจกรรม ข กิจกรรม ก กลับมาทำงานอีกครั้งพร้อมการคืนค่าสถานะ
เมื่อผู้ใช้ออกจากงานโดยใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส ไอคอนนี้จะทำงาน กิจกรรมจะหยุดลงและหน้าที่ของกิจกรรมจะเข้าไปอยู่ในพื้นหลัง ระบบจะเก็บรักษา สถานะของทุกกิจกรรมในงาน หากผู้ใช้กลับมาทำงานอีกครั้งในภายหลังโดย การเลือกไอคอนตัวเรียกใช้งานที่เริ่มงาน จากนั้นงานจะเข้ามา เบื้องหน้าและกลับมาทำกิจกรรมต่อที่ด้านบนของกลุ่ม
หากผู้ใช้แตะหรือท่าทางสัมผัส "กลับ" กิจกรรมปัจจุบันจะถูกดึงมาจาก และทำลายกลุ่มทิ้งแล้ว กิจกรรมก่อนหน้าในสแต็กจะกลับมาทำงานอีกครั้ง วันและเวลา กิจกรรมจะถูกทำลาย ระบบจะไม่เก็บสถานะของกิจกรรมไว้
ลักษณะการทำงานนี้จะแตกต่างออกไปสำหรับกิจกรรมตัวเรียกใช้งานรูท เมื่อแอปทํางานในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป
สามารถสร้างอินสแตนซ์กิจกรรมได้หลายครั้ง แม้จะมาจากงานอื่นๆ ก็ตาม
จัดการงานต่างๆ
Android จัดการงานและกลุ่มแบ็กโดยการวาง กิจกรรมทั้งหมดเริ่มต้นแบบต่อเนื่องในงานเดียวกัน ในช่วงสุดท้าย, ก่อน กองซ้อน วิธีนี้เหมาะสำหรับแอปส่วนใหญ่ และโดยทั่วไปแล้วคุณจึงไม่ต้องกังวล กิจกรรมของคุณเชื่อมโยงกับงานอย่างไร หรืออยู่ในเบื้องหลัง สแต็ก
อย่างไรก็ตาม คุณอาจตัดสินใจที่จะหยุดการทำงานตามปกติ ตัวอย่างเช่น คุณอาจต้องการให้กิจกรรมในแอปเริ่มงานใหม่เมื่อ เริ่มต้นแล้ว แทนที่จะอยู่ในงานปัจจุบัน หรือเมื่อคุณเริ่มใช้ คุณอาจต้องการนำอินสแตนซ์ที่มีอยู่ มาใช้แทนการ การสร้างอินสแตนซ์ใหม่เหนือแบ็กสแต็ก หรือคุณอาจ ต้องการล้างสแต็กด้านหลังออกจากกิจกรรมทั้งหมด ยกเว้นกิจกรรมรูท เมื่อผู้ใช้ออกจากงาน
คุณสามารถทำสิ่งเหล่านี้และอื่นๆ ได้โดยใช้แอตทริบิวต์ใน
องค์ประกอบไฟล์ Manifest ของ <activity>
และแจ้งเจตนารมณ์ที่คุณส่ง
startActivity()
แอตทริบิวต์ <activity>
หลักที่คุณใช้จัดการงานได้มีดังนี้
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
และต่อไปนี้คือ Flag Intent หลักที่คุณใช้ได้
ส่วนต่อไปนี้จะอธิบายถึงวิธีใช้แอตทริบิวต์ของไฟล์ Manifest และธงความตั้งใจเพื่อกำหนดว่ากิจกรรมจะเชื่อมโยงกับงานอย่างไร ทำงานในกลุ่มแบ็กกราวด์
นอกจากนี้ยังกล่าวถึงข้อควรพิจารณาเกี่ยวกับวิธีการทำงานของงานและกิจกรรมต่างๆ แสดงและจัดการในหน้าจอ "ล่าสุด" โดยปกติแล้ว คุณทำให้ ระบบจะกำหนดวิธีแสดงงานและกิจกรรมของคุณใน หน้าจอล่าสุด และคุณไม่จำเป็นต้องแก้ไขลักษณะการทำงานนี้ สำหรับข้อมูลเพิ่มเติม โปรดดูข้อมูลที่หัวข้อหน้าจอล่าสุด
กำหนดโหมดเปิดใช้งาน
โหมดเปิดใช้งานให้คุณกำหนดวิธีเชื่อมโยงอินสแตนซ์ใหม่ของกิจกรรม กับงานปัจจุบัน คุณสามารถกำหนดโหมดเปิดใช้งานได้ 2 วิธี ตามที่อธิบายไว้ ในหัวข้อต่อไปนี้
-
เมื่อคุณประกาศกิจกรรมในไฟล์ Manifest คุณสามารถระบุวิธี ที่เชื่อมโยงกับงานเมื่อเริ่มต้น
-
เมื่อคุณโทร
startActivity()
คุณสามารถใส่ค่าสถานะIntent
ที่ประกาศว่าอย่างไร (หรือว่า) กิจกรรมใหม่จะเชื่อมโยงกับงานปัจจุบัน
ดังนั้น หากกิจกรรม A เริ่มต้นกิจกรรม B กิจกรรม B ก็สามารถกําหนดได้ในไฟล์ Manifest เชื่อมโยงกับงานปัจจุบันอย่างไร และกิจกรรม ก สามารถใช้แฟล็ก Intent ได้ เพื่อขอวิธีเชื่อมโยงกิจกรรม B กับงานปัจจุบัน
หากทั้ง 2 อย่าง กิจกรรม B จะกำหนดการเชื่อมโยงกิจกรรม B กับงานใด จากนั้นกิจกรรม A ตามคำขอของกิจกรรม ข ตามที่นิยามไว้ในเจตนา ที่กำหนดไว้ในไฟล์ Manifest
กำหนดโหมดเปิดใช้งานโดยใช้ไฟล์ Manifest
เมื่อประกาศกิจกรรมในไฟล์ Manifest คุณสามารถระบุวิธี
ที่เชื่อมโยงกับงานโดยใช้
ขององค์ประกอบ <activity>
launchMode
โหมดการเปิดที่คุณกำหนดให้กับแอตทริบิวต์ launchMode
ได้มีอยู่ 5 โหมด ได้แก่
"standard"
- โหมดเริ่มต้น ระบบจะสร้างอินสแตนซ์ใหม่ของกิจกรรมในงาน จุดเริ่มต้นและจุดสิ้นสุดไปยังเส้นทางนั้น ระบบอาจเพิ่มกิจกรรม อินสแตนซ์หลายครั้ง แต่ละอินสแตนซ์อาจเป็นของงานที่แตกต่างกัน และ งานหนึ่งๆ อาจมีหลายอินสแตนซ์ได้
"singleTop"
- หากมีอินสแตนซ์ของกิจกรรมอยู่แล้วที่ด้านบนของงานปัจจุบัน
ระบบจะกำหนดเส้นทางความตั้งใจไปยังอินสแตนซ์นั้นผ่านการเรียกไปยัง
onNewIntent()
แทนการสร้างอินสแตนซ์ใหม่ของกิจกรรม กิจกรรม อินสแตนซ์หลายครั้ง แต่ละอินสแตนซ์อาจเป็นของงานที่แตกต่างกัน และ 1 งานอาจมีหลายอินสแตนซ์ได้ (เฉพาะเมื่อกิจกรรมที่อยู่ด้านบนสุดเท่านั้น) ของแบ็กสแต็กไม่ใช่อินสแตนซ์ที่มีอยู่ของกิจกรรม)
ตัวอย่างเช่น สมมติว่า Back Stack ของงานประกอบด้วยกิจกรรมรูท A ที่มี กิจกรรม B, C และ D อยู่ด้านบน (เพื่อให้สแต็กเป็น A-B-C-D โดยมี D อยู่ด้านบน) Intent มาถึงกิจกรรมประเภท D หาก D มีการเปิดตัว
"standard"
ตามค่าเริ่มต้น ระบบจะเรียกใช้อินสแตนซ์ใหม่ของคลาส และสแต็กจะกลายเป็น A-B-C-D-D อย่างไรก็ตาม หากโหมดการเรียกใช้งานของ D คือ"singleTop"
อินสแตนซ์ที่มีอยู่ของ D ได้รับ Intent ผ่านonNewIntent()
เนื่องจากอยู่ที่ด้านบนของกลุ่ม และสแต็กยังคงเป็น A-B-C-D หาก ในทางกลับกัน ไปยัง Intent สำหรับกิจกรรมประเภท B แล้ว อินสแตนซ์ใหม่ของ B จะถูกเพิ่มลงใน สแต็กแม้ว่าจะโหมดเปิดใช้งานของ"singleTop"
ก็ตาม"singleTask"
- ระบบจะสร้างกิจกรรมที่รูทของงานใหม่หรือค้นหา
กิจกรรมที่มีอยู่ของกลุ่มความสนใจเดียวกัน หากอินสแตนซ์ของ
มีกิจกรรมอยู่แล้ว โดยระบบจะกำหนดเส้นทาง
ลงในอินสแตนซ์ที่มีอยู่ผ่านการเรียกไปยังอินสแตนซ์
onNewIntent()
แทนการสร้างอินสแตนซ์ใหม่ ในขณะเดียวกัน อีก เกม กิจกรรมอื่นๆ เพิ่มเติมอีก จะถูกทำลายด้วย
"singleInstance"
- ลักษณะการทำงานจะเหมือนกับของ
"singleTask"
เว้นแต่ว่าระบบจะไม่เปิดรายการอื่นๆ ลงในงานที่มีอินสแตนซ์ กิจกรรมจะเป็น และเป็นสมาชิกคนเดียวที่ทำงานได้ กิจกรรมทั้งหมดที่เริ่มโดยกิจกรรมนี้จะเปิดใน งานแยกต่างหาก
"singleInstancePerTask"
- กิจกรรมสามารถเรียกใช้เป็นกิจกรรมรูทของงานได้เท่านั้น ซึ่งเป็นกิจกรรมแรก
กิจกรรมที่สร้างงาน ดังนั้นจึงมีเพียง 1 อินสแตนซ์
ของกิจกรรมนี้ในงาน วิธีนี้แตกต่างจากโหมดเปิดใช้งาน
singleTask
สามารถเริ่มกิจกรรมได้หลายอินสแตนซ์ในงานที่แตกต่างกัน หากFLAG_ACTIVITY_MULTIPLE_TASK
หรือFLAG_ACTIVITY_NEW_DOCUMENT
มีการตั้งค่า Flag
อีกตัวอย่างหนึ่งคือ แอปเบราว์เซอร์ Android ประกาศว่าเว็บเบราว์เซอร์
กิจกรรมจะเปิดในงานของตัวเองเสมอโดยระบุ singleTask
โหมดเปิดใช้งานใน <activity>
ซึ่งหมายความว่าหากแอปของคุณแสดง Intent ที่จะเปิด
เบราว์เซอร์จะไม่วางกิจกรรมไว้ในงานเดียวกับแอปของคุณ แต่
งานใหม่จะเริ่มต้นสำหรับเบราว์เซอร์ หรือหากเบราว์เซอร์มีงานอยู่แล้ว
ทำงานในพื้นหลัง งานนั้นจะถูกนำไปจัดการ
Intent
ไม่ว่ากิจกรรมจะเริ่มต้นในงานใหม่หรือในงานเดียวกัน
ที่เริ่มทำกิจกรรมนั้น ปุ่ม "ย้อนกลับ" และท่าทางสัมผัสจะใช้
ผู้ใช้ไปยังกิจกรรมก่อนหน้า แต่ถ้าคุณเริ่มกิจกรรมที่
ระบุ
โหมดเปิดใช้งาน singleTask
และอินสแตนซ์ของกิจกรรมนั้นอยู่ใน
งานในเบื้องหลัง งานนั้นทั้งหมดจะย้ายไปอยู่เบื้องหน้า ในจุดนี้
แบ็กสแต็กจะรวมกิจกรรมทั้งหมดจากงานที่นำมาซึ่งความคืบหน้า
ที่ด้านบนของกองซ้อน รูปที่ 4 แสดงสถานการณ์ประเภทนี้
![](https://developer.android.com/static/images/fundamentals/diagram_backstack_singletask_multiactivity.png?authuser=4&hl=th)
"singleTask"
ในแบ็กสแต็กแล้ว หากกิจกรรม
เป็นส่วนหนึ่งของงานพื้นหลังโดยมีสแต็กด้านหลังอยู่แล้ว
สแต็กด้านหลังทั้งหมดแสดงขึ้นมาด้านหน้าด้วย
งานสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้โหมดเปิดใช้งานในไฟล์ Manifest โปรดดู
เอกสารประกอบเกี่ยวกับเอลิเมนต์ <activity>
กำหนดโหมดเปิดใช้งานโดยใช้แฟล็ก Intent
เมื่อเริ่มกิจกรรม คุณจะแก้ไขการเชื่อมโยงเริ่มต้นของกิจกรรมได้
ต่องานของตนโดยใส่ Flag ในความตั้งใจที่คุณส่ง
startActivity()
แฟล็กที่คุณสามารถใช้เพื่อแก้ไขลักษณะการทำงานเริ่มต้นมีดังนี้
FLAG_ACTIVITY_NEW_TASK
ระบบจะเริ่มกิจกรรมในงานใหม่ หากมีงานทำงานอยู่แล้วสำหรับ กิจกรรมที่เริ่มต้นอยู่ งานนั้นจะถูกนำเข้ามาไว้ที่เบื้องหน้าโดยมี กู้คืนสถานะล่าสุด และกิจกรรมได้รับ Intent ใหม่ใน
onNewIntent()
ซึ่งจะสร้างลักษณะการทำงานเดียวกันกับ
"singleTask"
มีการพูดถึงมูลค่าlaunchMode
ในส่วนก่อนหน้านี้FLAG_ACTIVITY_SINGLE_TOP
หากกิจกรรมที่เริ่มต้นเป็นกิจกรรมปัจจุบัน ให้อยู่ด้านบนด้านหลัง อินสแตนซ์ที่มีอยู่จะได้รับการเรียกไปยัง
onNewIntent()
แทนที่จะสร้างอินสแตนซ์ใหม่ของกิจกรรมซึ่งจะสร้างลักษณะการทำงานเดียวกันกับ
"singleTop"
ค่าlaunchMode
ที่กล่าวถึงในส่วนก่อนหน้านี้FLAG_ACTIVITY_CLEAR_TOP
หากกิจกรรมที่เริ่มต้นอยู่ในงานปัจจุบันแล้ว แทนที่จะเปิดตัวกิจกรรมครั้งใหม่ ระบบจะทำลายกิจกรรมอื่นๆ ทั้งหมดที่ซ้อนอยู่ จุดประสงค์คือ ที่ส่งไปยังอินสแตนซ์ที่ดำเนินต่อของกิจกรรม ซึ่งตอนนี้อยู่ด้านบน
onNewIntent()
ไม่มีค่าสำหรับแอตทริบิวต์
launchMode
ที่ทำให้เกิดลักษณะการทำงานนี้FLAG_ACTIVITY_CLEAR_TOP
มักจะใช้ร่วมกับFLAG_ACTIVITY_NEW_TASK
เมื่อใช้ร่วมกัน แฟล็กเหล่านี้ หากิจกรรมที่มีอยู่ในงานอื่นแล้ววางไว้ในตำแหน่ง ซึ่งตอบสนองต่อความตั้งใจได้
จัดการผู้สนใจ
ผู้สนใจระบุว่ากิจกรรมใด "ต้องการ" ที่ควรเป็นเจ้าของ โดย กิจกรรมทั้งหมดจากแอปเดียวกันมีผู้สนใจซึ่งกันและกันดังนี้ พวกเขา "ชอบ" อยู่ในงานเดียวกัน
อย่างไรก็ตาม คุณสามารถแก้ไขกลุ่มความสนใจเริ่มต้นสำหรับกิจกรรมได้ กิจกรรมที่กำหนด ในแต่ละแอปสามารถแชร์ความสนใจกัน และทำกิจกรรมที่กำหนดไว้ในแอปเดียวกัน สามารถมอบหมายกลุ่มความสนใจในงานต่างๆ ได้
คุณแก้ไขความสนใจของกิจกรรมได้โดยใช้ taskAffinity
ของแอตทริบิวต์ <activity>
แอตทริบิวต์ taskAffinity
ใช้ค่าสตริงที่ต้องแตกต่างจาก
ชื่อแพ็กเกจเริ่มต้น
ที่ประกาศใน<manifest>
เนื่องจากระบบจะใช้ชื่อนั้นในการระบุงานเริ่มต้น
ผู้สนใจแอปนี้
กลุ่มความสนใจจะเข้ามามีบทบาทในสถานการณ์ 2 แบบดังนี้
เมื่อ Intent ที่เปิดกิจกรรมมี
FLAG_ACTIVITY_NEW_TASK
แจ้งโดยค่าเริ่มต้น กิจกรรมใหม่จะเปิดในกิจกรรมของกิจกรรมที่ โทรหา
startActivity()
งานจะดันเข้าไปอยู่ในกองหลังเดียวกับผู้โทรอย่างไรก็ตาม หาก Intent ที่ส่งไปยัง
startActivity()
มี วันที่FLAG_ACTIVITY_NEW_TASK
ระบบจะมองหางานอื่นเพื่อเก็บกิจกรรมใหม่ บ่อยครั้ง นี่เป็นงานใหม่ แต่ไม่จำเป็นต้องเป็นเช่นนั้นเสมอไป หากมี งานที่มีอยู่ที่มีความสนใจเดียวกับกิจกรรมใหม่ กิจกรรม เปิดตัวในงานนั้น หากไม่เป็นเช่นนั้น จะเป็นการเริ่มงานใหม่หากแฟล็กนี้ทำให้กิจกรรมเริ่มงานใหม่และผู้ใช้ใช้ ปุ่มหน้าแรกหรือท่าทางสัมผัสเพื่อออก ต้องมีวิธีบางอย่างให้ผู้ใช้ ให้กลับไปที่งานดังกล่าว เอนทิตีบางอย่าง เช่น เครื่องมือจัดการการแจ้งเตือน เริ่มต้นกิจกรรมในงานภายนอกเสมอ ไม่ได้เป็นส่วนหนึ่งของกิจกรรมเอง ดังนั้น พวกเขามักจะใส่
FLAG_ACTIVITY_NEW_TASK
ใน Intent ที่ส่งไปให้startActivity()
หากเป็นเอนทิตีภายนอกที่อาจ ใช้การตั้งค่าสถานะนี้สามารถเรียกใช้กิจกรรมของคุณ โปรดตรวจดูว่าผู้ใช้ อิสระในการกลับไปยัง งานที่เริ่มต้นแล้ว เช่น ไอคอน Launcher ซึ่งมีกิจกรรมรูทของ งานนี้มี
CATEGORY_LAUNCHER
Intent สำหรับข้อมูลเพิ่มเติม โปรดดูส่วนเกี่ยวกับการเริ่มงานเมื่อกิจกรรมมี
allowTaskReparenting
ตั้งค่าเป็น"true"
ในกรณีนี้ กิจกรรมอาจย้ายจากงานที่เริ่มต้นไว้ไปยังงานที่มี ความสนใจเมื่องานนั้นมาถึงเบื้องหน้า
ตัวอย่างเช่น สมมติว่ากิจกรรมที่รายงานสภาพอากาศใน เมืองที่เลือกเป็นส่วนหนึ่งของแอปท่องเที่ยว มีกลุ่มความสนใจเดียวกัน กิจกรรมอื่นๆ ในแอปเดียวกัน ผู้สนใจในแอปเริ่มต้น และสามารถ อีกครั้งด้วยแอตทริบิวต์นี้
เมื่อกิจกรรมหนึ่งของคุณเริ่มต้น ของการรายงานสภาพอากาศ ในตอนแรก เป็นงานเดียวกับ กิจกรรม แต่เมื่องานของแอปการเดินทางมาถึงเบื้องหน้า จะมีการมอบหมายงานสำหรับการรายงานสภาพอากาศใหม่ให้กับงานดังกล่าวและแสดงในงานนั้น
ล้างรายการด้านหลัง
หากผู้ใช้ออกจากงานเป็นเวลานาน ระบบจะล้างงาน กิจกรรมทั้งหมดยกเว้นกิจกรรมรูท เมื่อผู้ใช้กลับไปที่งาน เฉพาะกิจกรรมรากเท่านั้นที่ได้รับการกู้คืน ระบบจะทำงานแบบนี้ตาม สมมติว่าหลังจาก ผู้ใช้หยุดกลางคันในสิ่งที่ทำอยู่เป็นเวลานาน ก่อนและกลับไปที่งานเพื่อเริ่มต้นสิ่งใหม่ๆ
คุณใช้แอตทริบิวต์กิจกรรมบางอย่างเพื่อแก้ไขลักษณะการทำงานนี้ได้ ดังนี้
alwaysRetainTaskState
- เมื่อตั้งค่าแอตทริบิวต์นี้เป็น
"true"
ในกิจกรรมรูทของงาน ค่า ลักษณะการทำงานเริ่มต้นที่อธิบายไว้จะไม่เกิดขึ้น งานจะเก็บรักษาไว้ทั้งหมด กิจกรรมในกองซ้อนแม้หลังจากผ่านไปเป็นเวลานาน clearTaskOnLaunch
เมื่อตั้งค่าแอตทริบิวต์นี้เป็น
"true"
ในกิจกรรมรูทของงาน งาน จะถูกล้างลงไปที่กิจกรรมรูทเมื่อใดก็ตามที่ผู้ใช้ออกจากงานและ กลับไปที่ข้อความนั้น กล่าวคือ ในทางตรงกันข้ามalwaysRetainTaskState
ผู้ใช้กลับไปที่งานในสถานะเริ่มต้นเสมอ แม้ว่าจะออกจาก งานนั้นได้เพียงชั่วขณะfinishOnTaskLaunch
แอตทริบิวต์นี้เหมือนกับ
clearTaskOnLaunch
แต่ทำงานด้วยกิจกรรมเดียว ไม่ใช่งานทั้งหมด และยังทำให้ กิจกรรมใดๆ ที่สิ้นสุด ยกเว้นกิจกรรมราก เมื่อตั้งค่าเป็น"true"
กิจกรรมนี้จะยังคงเป็นส่วนหนึ่งของงานสำหรับเซสชันปัจจุบันเท่านั้น หากผู้ใช้ออกจากงานแล้วกลับไปที่งาน ก็แสดงว่างานไม่มีอยู่อีกต่อไป
เริ่มงาน
คุณตั้งค่ากิจกรรมให้เป็นจุดแรกเข้าของงานได้โดยระบุความตั้งใจ
กรองด้วย "android.intent.action.MAIN"
เป็นการดำเนินการที่ระบุและ
"android.intent.category.LAUNCHER"
ในหมวดหมู่ที่ระบุ:
<activity ... >
<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>
ตัวกรอง Intent ประเภทนี้จะทำให้มีไอคอนและป้ายกำกับสำหรับกิจกรรม แสดงในตัวเปิดแอป ทำให้ผู้ใช้มีวิธีเปิดกิจกรรมและ กลับไปยังงานที่สร้างเมื่อใดก็ตามหลังการเปิดตัว
ความสามารถที่สองนี้เป็นสิ่งสำคัญ ผู้ใช้ต้องออกจากงานได้
ให้กลับมาทำต่อภายหลังโดยใช้ตัวเปิดแอปนี้ ด้วยเหตุนี้ โปรดใช้
ทั้ง 2 อย่าง
โหมดเปิดใช้งานที่ทำเครื่องหมายกิจกรรมว่าเริ่มต้นงานเสมอ "singleTask"
และ "singleInstance"
เมื่อกิจกรรมมี
ACTION_MAIN
และ
CATEGORY_LAUNCHER
ตัวกรอง
ลองนึกดูว่าจะเกิดอะไรขึ้นหากไม่มีตัวกรอง เช่น
Intent เปิดตัวกิจกรรม "singleTask"
, เริ่มงานใหม่ และผู้ใช้
ต้องใช้เวลาในการทำงานนั้น จากนั้นผู้ใช้จะใช้ปุ่มหน้าแรก หรือ
ท่าทางสัมผัส งานถูกส่งไปยังพื้นหลังแล้วจึงจะไม่ปรากฏ ตอนนี้ผู้ใช้
ไม่มีทางที่จะกลับไปที่งานได้ เนื่องจากงานไม่แสดงอยู่ในแอป
Launcher
ในกรณีที่คุณไม่ต้องการให้ผู้ใช้กลับไปยัง
กิจกรรม ให้ตั้งค่า <activity>
finishOnTaskLaunch
ขององค์ประกอบ
เป็น "true"
สำหรับข้อมูลเพิ่มเติม โปรดดูส่วนการล้างแบ็กสแต็ก
ข้อมูลเพิ่มเติมเกี่ยวกับวิธีแสดงและจัดการงานและกิจกรรม ในหน้าจอ "ล่าสุด" มีอยู่ในล่าสุด หน้าจอ