Tasks และแบ็กสแต็ก

งาน คือคอลเล็กชันกิจกรรมที่ผู้ใช้โต้ตอบด้วยเมื่อพยายาม ทำอะไรสักอย่างในแอป กิจกรรมเหล่านี้จะจัดเรียงเป็นกลุ่มที่เรียกว่า back Stack ตามลำดับการเปิดแต่ละกิจกรรม

เช่น แอปอีเมล อาจมีกิจกรรม 1 รายการเพื่อแสดงรายการข้อความใหม่ เมื่อผู้ใช้เลือก กิจกรรมใหม่จะเปิดขึ้นเพื่อดูข้อความนั้น เพิ่มกิจกรรมใหม่นี้แล้ว ไว้ในกองหลัง จากนั้น เมื่อผู้ใช้แตะหรือท่าทางสัมผัส "กลับ" กิจกรรมใหม่ดังกล่าว เสร็จสิ้นแล้วและหลุดออกจากกองซ้อน

วงจรของงานและสแต็กด้านหลัง

หน้าจอหลักของอุปกรณ์คือจุดเริ่มต้นสำหรับงานส่วนใหญ่ เมื่อผู้ใช้แตะ ไอคอนสำหรับแอปหรือทางลัดในตัวเปิดแอปหรือในหน้าจอหลัก ให้แอปพลิเคชันนั้นอยู่เบื้องหน้า หากแอปไม่มีงาน ระบบจะดำเนินการ ระบบจะสร้างงานใหม่และ กิจกรรมของแอปนั้นเปิดขึ้น เป็นกิจกรรมรากในกลุ่ม

เมื่อกิจกรรมปัจจุบันเริ่มอีกกิจกรรมหนึ่ง ระบบจะพุชกิจกรรมใหม่ไว้ที่ด้านบนสุด ของกองซ้อนและให้ความสำคัญ กิจกรรมก่อนหน้าจะยังคงอยู่ในกอง แต่ หยุดแล้ว เมื่อกิจกรรมหยุดลง ระบบจะรักษาสถานะปัจจุบันของกิจกรรมไว้ ของอินเทอร์เฟซผู้ใช้ เมื่อผู้ใช้ดำเนินการย้อนกลับ กิจกรรมปัจจุบันจะเป็น เด้งออกมาจากกองซ้อนและทำลายแล้ว กิจกรรมก่อนหน้าจะกลับมาทำงานอีกครั้ง และระบบจะคืนค่าสถานะก่อนหน้าของ UI

กิจกรรมใน กองซ้อนจะไม่จัดเรียงใหม่ แต่จะพุชเข้าไปใหม่และดึงออกจากกองตามเดิมเท่านั้น เริ่มต้นโดยกิจกรรมปัจจุบันและผู้ใช้ปิดไป ผ่านปุ่มย้อนกลับหรือท่าทางสัมผัส ดังนั้น Back Stack จึงทำงานเป็น โครงสร้างออบเจ็กต์ที่สุดท้ายก่อนสิ้นสุด รูปที่ 1 แสดงลำดับเวลาที่มี กิจกรรมที่ถูกผลักเข้าและถูกดึงขึ้นมาจากกองหลัง

วันที่
รูปที่ 1 การนำเสนอว่ากิจกรรมใหม่แต่ละรายการใน งานจะเพิ่มรายการใน Back Stack เมื่อผู้ใช้แตะหรือท่าทางสัมผัส ย้อนกลับ ระบบจะทำลายกิจกรรมปัจจุบันและกิจกรรมก่อนหน้า กลับมาทำงานอีกครั้ง

ขณะที่ผู้ใช้ยังคงแตะหรือทำท่าทางสัมผัส "กลับ" แต่ละกิจกรรมในกองซ้อน ถูกดึงเพื่อแสดงข้อความก่อนหน้า จนกว่าผู้ใช้จะกลับไปที่หน้าแรก หรือกิจกรรมใดๆ ที่ทำงานอยู่เมื่องานเริ่มต้นขึ้น เมื่อทั้งหมด ระบบจะนำกิจกรรมออกจากสแต็ก ไม่มีงานนี้แล้ว

ลักษณะการทำงานของการแตะย้อนกลับสำหรับกิจกรรมของตัวเรียกใช้งานรูท

กิจกรรม Launcher รูทคือกิจกรรมที่ประกาศความตั้งใจ กรองโดยใช้ทั้ง 2 แบบ ACTION_MAIN และ CATEGORY_LAUNCHER กิจกรรมเหล่านี้ไม่ซ้ำกัน เนื่องจากทำหน้าที่เป็นจุดแรกเข้าของแอปจาก ตัวเปิดแอปและใช้เพื่อเริ่มต้นงาน

เมื่อผู้ใช้แตะหรือท่าทางสัมผัส "ย้อนกลับจากกิจกรรมตัวเรียกใช้งานรูท" ระบบจะ จะจัดการกับกิจกรรมแตกต่างกันไป โดยขึ้นอยู่กับเวอร์ชันของ Android ที่ อุปกรณ์กำลังทำงาน

ลักษณะการทำงานของระบบใน Android 11 และต่ำกว่า
ระบบทำกิจกรรมจนเสร็จสิ้น
ลักษณะการทำงานของระบบใน Android 12 ขึ้นไป

ระบบจะย้ายกิจกรรมและงานไปยังพื้นหลัง ทำกิจกรรมให้เสร็จ ลักษณะการทำงานนี้จะตรงกับลักษณะการทำงานเริ่มต้นของระบบเมื่อ การออกจากแอปโดยใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส

ในกรณีส่วนใหญ่ ลักษณะการทำงานนี้หมายความว่าผู้ใช้สามารถกลับมาใช้งานแอปของคุณอีกครั้งได้เร็วขึ้น จากสถานะที่อบอุ่นแทนที่จะเป็น โดยต้องรีสตาร์ทแอปโดยสมบูรณ์จากCold

หากคุณต้องการระบุการนำทางกลับที่กำหนดเอง เราขอแนะนําให้ใช้ AndroidX Activity API แทนการลบล้าง onBackPressed() API กิจกรรม AndroidX จะเลื่อนไปตาม ลักษณะการทำงานที่เหมาะสมของระบบหากไม่มีองค์ประกอบที่ขัดขวางระบบ แตะด้านหลัง

อย่างไรก็ตาม หากแอปลบล้าง onBackPressed() เพื่อจัดการ การนำทาง "ย้อนกลับ" และทำกิจกรรมให้เสร็จสิ้น อัปเดตการใช้งานเพื่อโทร ไปจนถึง super.onBackPressed() แทนที่จะดูจนจบ การโทร super.onBackPressed() ย้ายกิจกรรมและงานไปยังพื้นหลังเมื่อ ที่เหมาะสมและมอบประสบการณ์การนำทางที่สอดคล้องกันมากขึ้นสำหรับผู้ใช้ ข้ามแอป

งานในเบื้องหลังและงานเบื้องหน้า

วันที่
รูปที่ 2 งาน 2 รายการ: งาน ข ได้รับการโต้ตอบของผู้ใช้ใน ขณะที่งาน A อยู่ในเบื้องหลังเพื่อ ให้กลับมาสมัครใช้บริการอีกครั้ง

งานคือหน่วยที่สอดคล้องกันที่สามารถย้ายไปยังพื้นหลังเมื่อผู้ใช้เริ่มต้น งานใหม่หรือไปที่หน้าจอหลัก กิจกรรมทั้งหมดในเบื้องหลัง ในงานถูกหยุด แต่ Back Stack สำหรับงานจะยังคงเดิม - งาน โฟกัสจะหายไปในขณะที่มีงานอื่นเกิดขึ้น ดังที่แสดงในรูปที่ 2 ต งานนั้นจะกลับไปที่เบื้องหน้า เพื่อให้ผู้ใช้เลือกต่อจากจุดที่ค้างไว้ได้ ปิดอยู่

พิจารณาโฟลว์งานต่อไปนี้สำหรับงานปัจจุบัน A ที่ มี 3 กิจกรรมในกลุ่มโดยมี 2 กิจกรรมอยู่ในกิจกรรมปัจจุบัน ดังนี้

  1. ผู้ใช้ใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส จากนั้นเริ่มแอปใหม่จาก เครื่องเรียกใช้งานแอป

    เมื่อหน้าจอหลักปรากฏขึ้น งาน ก จะเข้าสู่พื้นหลัง เมื่อมีการเปิดตัว แอปเริ่มทำงาน ระบบจะเริ่มงานสำหรับแอปนั้น (งาน ข) ด้วยสแต็กของตัวเอง ของกิจกรรม

  2. หลังจากที่โต้ตอบกับแอปนั้นแล้ว ผู้ใช้จะกลับมาที่หน้าแรกอีกครั้งและเลือก แอปที่เริ่มต้นงาน A ในตอนแรก

    ตอนนี้งาน A จะมาอยู่ที่เบื้องหน้าแล้ว โดยกิจกรรมทั้ง 3 อย่างในสแต็กมีดังนี้ ยังคงอยู่ และกิจกรรมที่ด้านบนของสแต็กจะกลับมาทำงานอีกครั้ง ในจุดนี้ ฟิลด์ ผู้ใช้ยังสลับกลับไปที่งาน ข. ได้โดยไปที่หน้าแรกและเลือกไอคอนแอป ที่เริ่มต้นงานนั้นหรือเลือกงานของแอปจากรายการล่าสุด หน้าจอ

กิจกรรมหลายรายการ

วันที่
รูปที่ 3 กิจกรรมเดียวสามารถสร้างอินสแตนซ์ได้หลายรายการ ครั้ง

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

หากผู้ใช้ย้อนกลับโดยใช้ตัวเลือก "กลับ" ปุ่มหรือท่าทางสัมผัส อินสแตนซ์ของกิจกรรมจะแสดงตามลำดับ โดยแต่ละรายการจะมีสถานะ UI ของตนเอง อย่างไรก็ตาม คุณสามารถแก้ไข หากคุณไม่ต้องการให้มีการสร้างอินสแตนซ์กิจกรรมมากกว่า 1 ครั้ง ดูข้อมูล เพิ่มเติมเกี่ยวกับเรื่องนี้ในหัวข้อเกี่ยวกับการจัดการ Tasks

สภาพแวดล้อมแบบหลายหน้าต่าง

เมื่อแอปทำงานพร้อมกันในหลายหน้าต่าง สภาพแวดล้อม ที่รองรับใน Android 7.0 (API 24) ขึ้นไป ระบบจะจัดการงานแยกกันสำหรับแต่ละหน้าต่าง ชิ้น สามารถมีงานได้หลายรายการ เช่นเดียวกันกับแอป Android ที่ทำงานบน Chromebook: ระบบการจัดการงานหรือกลุ่มงานใน ต่อหน้าต่าง

สรุปวงจร

หากต้องการสรุปลักษณะการทำงานเริ่มต้นสำหรับกิจกรรมและงาน ให้ทำดังนี้

  • เมื่อกิจกรรม A เริ่มกิจกรรม B กิจกรรม A จะหยุดลง แต่ระบบ สถานะต่างๆ เช่น ตำแหน่งการเลื่อนและข้อความที่ป้อนลงในแบบฟอร์มจะยังคงเดิม ถ้า ผู้ใช้แตะหรือใช้ท่าทางสัมผัสย้อนกลับขณะอยู่ในกิจกรรม ข กิจกรรม ก กลับมาทำงานอีกครั้งพร้อมการคืนค่าสถานะ

  • เมื่อผู้ใช้ออกจากงานโดยใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส ไอคอนนี้จะทำงาน กิจกรรมจะหยุดลงและหน้าที่ของกิจกรรมจะเข้าไปอยู่ในพื้นหลัง ระบบจะเก็บรักษา สถานะของทุกกิจกรรมในงาน หากผู้ใช้กลับมาทำงานอีกครั้งในภายหลังโดย การเลือกไอคอนตัวเรียกใช้งานที่เริ่มงาน จากนั้นงานจะเข้ามา เบื้องหน้าและกลับมาทำกิจกรรมต่อที่ด้านบนของกลุ่ม

  • หากผู้ใช้แตะหรือท่าทางสัมผัส "กลับ" กิจกรรมปัจจุบันจะถูกดึงมาจาก และทำลายกลุ่มทิ้งแล้ว กิจกรรมก่อนหน้าในสแต็กจะกลับมาทำงานอีกครั้ง วันและเวลา กิจกรรมจะถูกทำลาย ระบบจะไม่เก็บสถานะของกิจกรรมไว้

    ลักษณะการทำงานนี้จะแตกต่างออกไปสำหรับกิจกรรมตัวเรียกใช้งานรูท เมื่อแอปทํางานในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป

  • สามารถสร้างอินสแตนซ์กิจกรรมได้หลายครั้ง แม้จะมาจากงานอื่นๆ ก็ตาม

จัดการงานต่างๆ

Android จัดการงานและกลุ่มแบ็กโดยการวาง กิจกรรมทั้งหมดเริ่มต้นแบบต่อเนื่องในงานเดียวกัน ในช่วงสุดท้าย, ก่อน กองซ้อน วิธีนี้เหมาะสำหรับแอปส่วนใหญ่ และโดยทั่วไปแล้วคุณจึงไม่ต้องกังวล กิจกรรมของคุณเชื่อมโยงกับงานอย่างไร หรืออยู่ในเบื้องหลัง สแต็ก

อย่างไรก็ตาม คุณอาจตัดสินใจที่จะหยุดการทำงานตามปกติ ตัวอย่างเช่น คุณอาจต้องการให้กิจกรรมในแอปเริ่มงานใหม่เมื่อ เริ่มต้นแล้ว แทนที่จะอยู่ในงานปัจจุบัน หรือเมื่อคุณเริ่มใช้ คุณอาจต้องการนำอินสแตนซ์ที่มีอยู่ มาใช้แทนการ การสร้างอินสแตนซ์ใหม่เหนือแบ็กสแต็ก หรือคุณอาจ ต้องการล้างสแต็กด้านหลังออกจากกิจกรรมทั้งหมด ยกเว้นกิจกรรมรูท เมื่อผู้ใช้ออกจากงาน

คุณสามารถทำสิ่งเหล่านี้และอื่นๆ ได้โดยใช้แอตทริบิวต์ใน องค์ประกอบไฟล์ Manifest ของ <activity> และแจ้งเจตนารมณ์ที่คุณส่ง startActivity()

แอตทริบิวต์ <activity> หลักที่คุณใช้จัดการงานได้มีดังนี้

และต่อไปนี้คือ Flag Intent หลักที่คุณใช้ได้

ส่วนต่อไปนี้จะอธิบายถึงวิธีใช้แอตทริบิวต์ของไฟล์ Manifest และธงความตั้งใจเพื่อกำหนดว่ากิจกรรมจะเชื่อมโยงกับงานอย่างไร ทำงานในกลุ่มแบ็กกราวด์

นอกจากนี้ยังกล่าวถึงข้อควรพิจารณาเกี่ยวกับวิธีการทำงานของงานและกิจกรรมต่างๆ แสดงและจัดการในหน้าจอ "ล่าสุด" โดยปกติแล้ว คุณทำให้ ระบบจะกำหนดวิธีแสดงงานและกิจกรรมของคุณใน หน้าจอล่าสุด และคุณไม่จำเป็นต้องแก้ไขลักษณะการทำงานนี้ สำหรับข้อมูลเพิ่มเติม โปรดดูข้อมูลที่หัวข้อหน้าจอล่าสุด

กำหนดโหมดเปิดใช้งาน

โหมดเปิดใช้งานให้คุณกำหนดวิธีเชื่อมโยงอินสแตนซ์ใหม่ของกิจกรรม กับงานปัจจุบัน คุณสามารถกำหนดโหมดเปิดใช้งานได้ 2 วิธี ตามที่อธิบายไว้ ในหัวข้อต่อไปนี้

  • การใช้ไฟล์ Manifest

    เมื่อคุณประกาศกิจกรรมในไฟล์ Manifest คุณสามารถระบุวิธี ที่เชื่อมโยงกับงานเมื่อเริ่มต้น

  • การใช้แฟล็ก Intent

    เมื่อคุณโทร startActivity() คุณสามารถใส่ค่าสถานะ Intent ที่ประกาศว่าอย่างไร (หรือว่า) กิจกรรมใหม่จะเชื่อมโยงกับงานปัจจุบัน

ดังนั้น หากกิจกรรม A เริ่มต้นกิจกรรม B กิจกรรม B ก็สามารถกําหนดได้ในไฟล์ Manifest เชื่อมโยงกับงานปัจจุบันอย่างไร และกิจกรรม ก สามารถใช้แฟล็ก Intent ได้ เพื่อขอวิธีเชื่อมโยงกิจกรรม B กับงานปัจจุบัน

หากทั้ง 2 อย่าง กิจกรรม B จะกำหนดการเชื่อมโยงกิจกรรม B กับงานใด จากนั้นกิจกรรม A ตามคำขอของกิจกรรม ข ตามที่นิยามไว้ในเจตนา ที่กำหนดไว้ในไฟล์ Manifest

กำหนดโหมดเปิดใช้งานโดยใช้ไฟล์ Manifest

เมื่อประกาศกิจกรรมในไฟล์ Manifest คุณสามารถระบุวิธี ที่เชื่อมโยงกับงานโดยใช้ ขององค์ประกอบ <activity> launchMode

โหมดการเปิดที่คุณกำหนดให้กับแอตทริบิวต์ launchMode ได้มีอยู่ 5 โหมด ได้แก่

  1. "standard"
    โหมดเริ่มต้น ระบบจะสร้างอินสแตนซ์ใหม่ของกิจกรรมในงาน จุดเริ่มต้นและจุดสิ้นสุดไปยังเส้นทางนั้น ระบบอาจเพิ่มกิจกรรม อินสแตนซ์หลายครั้ง แต่ละอินสแตนซ์อาจเป็นของงานที่แตกต่างกัน และ งานหนึ่งๆ อาจมีหลายอินสแตนซ์ได้
  2. "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" ก็ตาม

  3. "singleTask"
    ระบบจะสร้างกิจกรรมที่รูทของงานใหม่หรือค้นหา กิจกรรมที่มีอยู่ของกลุ่มความสนใจเดียวกัน หากอินสแตนซ์ของ มีกิจกรรมอยู่แล้ว โดยระบบจะกำหนดเส้นทาง ลงในอินสแตนซ์ที่มีอยู่ผ่านการเรียกไปยังอินสแตนซ์ onNewIntent() แทนการสร้างอินสแตนซ์ใหม่ ในขณะเดียวกัน อีก เกม กิจกรรมอื่นๆ เพิ่มเติมอีก จะถูกทำลายด้วย
  4. "singleInstance"
    ลักษณะการทำงานจะเหมือนกับของ "singleTask" เว้นแต่ว่าระบบจะไม่เปิดรายการอื่นๆ ลงในงานที่มีอินสแตนซ์ กิจกรรมจะเป็น และเป็นสมาชิกคนเดียวที่ทำงานได้ กิจกรรมทั้งหมดที่เริ่มโดยกิจกรรมนี้จะเปิดใน งานแยกต่างหาก
  5. "singleInstancePerTask"
    กิจกรรมสามารถเรียกใช้เป็นกิจกรรมรูทของงานได้เท่านั้น ซึ่งเป็นกิจกรรมแรก กิจกรรมที่สร้างงาน ดังนั้นจึงมีเพียง 1 อินสแตนซ์ ของกิจกรรมนี้ในงาน วิธีนี้แตกต่างจากโหมดเปิดใช้งาน singleTask สามารถเริ่มกิจกรรมได้หลายอินสแตนซ์ในงานที่แตกต่างกัน หาก FLAG_ACTIVITY_MULTIPLE_TASK หรือ FLAG_ACTIVITY_NEW_DOCUMENT มีการตั้งค่า Flag

อีกตัวอย่างหนึ่งคือ แอปเบราว์เซอร์ Android ประกาศว่าเว็บเบราว์เซอร์ กิจกรรมจะเปิดในงานของตัวเองเสมอโดยระบุ singleTask โหมดเปิดใช้งานใน <activity> ซึ่งหมายความว่าหากแอปของคุณแสดง Intent ที่จะเปิด เบราว์เซอร์จะไม่วางกิจกรรมไว้ในงานเดียวกับแอปของคุณ แต่ งานใหม่จะเริ่มต้นสำหรับเบราว์เซอร์ หรือหากเบราว์เซอร์มีงานอยู่แล้ว ทำงานในพื้นหลัง งานนั้นจะถูกนำไปจัดการ Intent

ไม่ว่ากิจกรรมจะเริ่มต้นในงานใหม่หรือในงานเดียวกัน ที่เริ่มทำกิจกรรมนั้น ปุ่ม "ย้อนกลับ" และท่าทางสัมผัสจะใช้ ผู้ใช้ไปยังกิจกรรมก่อนหน้า แต่ถ้าคุณเริ่มกิจกรรมที่ ระบุ โหมดเปิดใช้งาน singleTask และอินสแตนซ์ของกิจกรรมนั้นอยู่ใน งานในเบื้องหลัง งานนั้นทั้งหมดจะย้ายไปอยู่เบื้องหน้า ในจุดนี้ แบ็กสแต็กจะรวมกิจกรรมทั้งหมดจากงานที่นำมาซึ่งความคืบหน้า ที่ด้านบนของกองซ้อน รูปที่ 4 แสดงสถานการณ์ประเภทนี้

วันที่
รูปที่ 4 การนำเสนอว่ากิจกรรมที่มีการเปิดตัว เพิ่มโหมด "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 แบบดังนี้

  1. เมื่อ Intent ที่เปิดกิจกรรมมี FLAG_ACTIVITY_NEW_TASK แจ้ง

    โดยค่าเริ่มต้น กิจกรรมใหม่จะเปิดในกิจกรรมของกิจกรรมที่ โทรหา startActivity() งานจะดันเข้าไปอยู่ในกองหลังเดียวกับผู้โทร

    อย่างไรก็ตาม หาก Intent ที่ส่งไปยัง startActivity() มี วันที่ FLAG_ACTIVITY_NEW_TASK ระบบจะมองหางานอื่นเพื่อเก็บกิจกรรมใหม่ บ่อยครั้ง นี่เป็นงานใหม่ แต่ไม่จำเป็นต้องเป็นเช่นนั้นเสมอไป หากมี งานที่มีอยู่ที่มีความสนใจเดียวกับกิจกรรมใหม่ กิจกรรม เปิดตัวในงานนั้น หากไม่เป็นเช่นนั้น จะเป็นการเริ่มงานใหม่

    หากแฟล็กนี้ทำให้กิจกรรมเริ่มงานใหม่และผู้ใช้ใช้ ปุ่มหน้าแรกหรือท่าทางสัมผัสเพื่อออก ต้องมีวิธีบางอย่างให้ผู้ใช้ ให้กลับไปที่งานดังกล่าว เอนทิตีบางอย่าง เช่น เครื่องมือจัดการการแจ้งเตือน เริ่มต้นกิจกรรมในงานภายนอกเสมอ ไม่ได้เป็นส่วนหนึ่งของกิจกรรมเอง ดังนั้น พวกเขามักจะใส่ FLAG_ACTIVITY_NEW_TASK ใน Intent ที่ส่งไปให้ startActivity()

    หากเป็นเอนทิตีภายนอกที่อาจ ใช้การตั้งค่าสถานะนี้สามารถเรียกใช้กิจกรรมของคุณ โปรดตรวจดูว่าผู้ใช้ อิสระในการกลับไปยัง งานที่เริ่มต้นแล้ว เช่น ไอคอน Launcher ซึ่งมีกิจกรรมรูทของ งานนี้มี CATEGORY_LAUNCHER Intent สำหรับข้อมูลเพิ่มเติม โปรดดูส่วนเกี่ยวกับการเริ่มงาน

  2. เมื่อกิจกรรมมี 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" สำหรับข้อมูลเพิ่มเติม โปรดดูส่วนการล้างแบ็กสแต็ก

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีแสดงและจัดการงานและกิจกรรม ในหน้าจอ "ล่าสุด" มีอยู่ในล่าสุด หน้าจอ

แหล่งข้อมูลเพิ่มเติม