ข้อจํากัดในการเริ่มกิจกรรมจากเบื้องหลัง

Android 10 (API ระดับ 29) ขึ้นไปจะจำกัดเวลาที่แอปสามารถเริ่มกิจกรรมเมื่อแอปทำงานอยู่เบื้องหลัง ข้อจำกัดเหล่านี้ช่วยลดการหยุดชะงักของผู้ใช้ และช่วยให้ผู้ใช้ควบคุมสิ่งที่แสดงบนหน้าจอได้มากขึ้น

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

แสดงการแจ้งเตือนแทน

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

ระบบการเตือนและช่วยเตือนที่ใช้การแจ้งเตือนนี้มีข้อดีหลายอย่างสำหรับผู้ใช้ ดังนี้

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

เวลาที่แอปจะเริ่มกิจกรรมได้

แอปที่ทำงานใน Android 10 ขึ้นไปจะเริ่มกิจกรรมได้เมื่อเป็นไปตามเงื่อนไขต่อไปนี้อย่างน้อย 1 ข้อ

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

  • แอปมีกิจกรรมที่เพิ่งเริ่มต้น

  • แอปชื่อ finish() ดำเนินการเมื่อเร็วๆ นี้ ซึ่งจะมีผลก็ต่อเมื่อแอปมีกิจกรรมในเบื้องหน้าหรือกิจกรรมในกองซ้อนด้านหลังของงานเบื้องหน้า ณ เวลาที่มีการเรียก finish()

  • แอปมีบริการต่อไปนี้อย่างน้อย 1 รายการที่ระบบเชื่อมโยงไว้ บริการเหล่านี้อาจต้องเปิด UI

  • แอปมีบริการที่เชื่อมโยงกับแอปอื่นที่มองเห็นได้ แอปที่เชื่อมโยงกับบริการต้องยังคงมองเห็นได้เพื่อให้แอปทำงานในเบื้องหลังได้สําเร็จ

  • แอปได้รับการแจ้งเตือน PendingIntent จากระบบ ในกรณีที่มี Intent ที่รอดำเนินการสำหรับบริการและตัวรับการออกอากาศ แอปจะเริ่มกิจกรรมได้เป็นเวลา 2-3 วินาทีหลังจากที่ส่ง Intent ที่รอดำเนินการ

  • แอปจะได้รับ PendingIntent ซึ่งส่งมาจากแอปอื่น ที่มองเห็นได้

  • แอปได้รับการออกอากาศของระบบซึ่งแอปคาดว่าจะเปิด UI ตัวอย่างเช่น ACTION_NEW_OUTGOING_CALL และ SECRET_CODE_ACTION แอปจะเริ่มกิจกรรมได้เป็นเวลา 2-3 วินาทีหลังจากที่ส่งการออกอากาศ

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

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

  • แอปได้รับสิทธิ์SYSTEM_ALERT_WINDOWจากผู้ใช้

ต้องเลือกใช้เมื่อเริ่มกิจกรรมจาก PendingIntent

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

แอปที่กำหนดเป้าหมายเป็น Android 15 ขึ้นไปจะไม่ให้สิทธิ์เปิดกิจกรรมเบื้องหลัง (BAL) โดยนัยแก่ PendingIntents ที่สร้างโดยค่าเริ่มต้นอีกต่อไป ต้องมีการเลือกใช้อย่างชัดเจน โดยตัวเลือกมีดังนี้ โดยขึ้นอยู่กับว่าแอปส่งหรือสร้าง PendingIntents

ตาราง Intent ที่รอดำเนินการ
รูปที่ 1: ขั้นตอนการตัดสินใจสําหรับการเปิดใช้งานกิจกรรมเบื้องหลัง

โดยผู้ส่ง PendingIntent

แอปที่กําหนดเป้าหมายเป็น Android 14 ขึ้นไปซึ่งต้องการเริ่ม PendingIntent ต้อง

  • ปฏิบัติตามเงื่อนไขที่ระบุไว้ และ
  • เลือกใช้เพื่ออนุญาตให้เปิดใช้งานกิจกรรมในเบื้องหลังตามข้อยกเว้นเหล่านั้น

การเลือกรับนี้ควรเกิดขึ้นก็ต่อเมื่อนักพัฒนาแอปทราบว่าแอปกำลังจะเริ่มกิจกรรม

หากต้องการเลือกใช้ แอปควรส่งแพ็กเกจ ActivityOptions ที่มี setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) ไปยัง PendingIntent.send() หรือวิธีการที่คล้ายกัน

โดยผู้สร้าง PendingIntent

ตอนนี้แอปที่กําหนดเป้าหมายเป็น Android 15 ขึ้นไปซึ่งสร้าง PendingIntent จะต้องเลือกรับอย่างชัดเจนเพื่ออนุญาตให้เปิดกิจกรรมเบื้องหลัง หากต้องการให้ PendingIntents เหล่านั้นเริ่มทํางานภายใต้เงื่อนไขที่ระบุไว้

ในกรณีส่วนใหญ่ แอปที่เริ่ม PendingIntent ควรเป็นผู้เลือกเข้าร่วม อย่างไรก็ตาม หากแอปที่สร้างต้องให้สิทธิ์เหล่านี้ ให้ทำดังนี้

  • คุณสามารถเริ่ม PendingIntent ได้ทุกเมื่อที่มองเห็นแอปที่สร้างอยู่
  • PendingIntent สามารถเริ่มต้นได้ทุกเมื่อหากแอปที่สร้างมีสิทธิ์พิเศษ

หากต้องการเลือกใช้ แอปควรส่ง ActivityOptions Bundle ที่มี setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) ไปยัง PendingIntent.getActivity() หรือเมธอดที่คล้ายกัน

อ่านรายละเอียดเพิ่มเติมในเอกสารอ้างอิงที่เกี่ยวข้อง