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

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

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

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

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

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

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

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

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

  • แอปมีหน้าต่างที่มองเห็นได้ เช่น กิจกรรมที่ทำงานอยู่เบื้องหน้า

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

  • แอปมีกิจกรรมใน Back Stack ของงานที่มีอยู่ในหน้าจอ แอปที่ใช้ล่าสุด

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

  • แอปเรียก finish() ใน กิจกรรมเมื่อไม่นานมานี้ การดำเนินการนี้จะมีผลเฉพาะเมื่อแอปมีกิจกรรมที่ทำงานอยู่เบื้องหน้าหรือกิจกรรมใน Back Stack ของงานที่ทำงานอยู่เบื้องหน้าในขณะที่เรียก finish()

  • แอปมีบริการอย่างใดอย่างหนึ่งต่อไปนี้ที่ระบบผูกไว้ บริการเหล่านี้อาจต้องเปิด UI

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

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

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

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

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

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

  • ผู้ใช้ให้สิทธิ์ SYSTEM_ALERT_WINDOW แก่แอป

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

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

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

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

โดยผู้ส่ง PendingIntent

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

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

การเลือกใช้นี้ควรเกิดขึ้นเฉพาะ ในกรณีที่นักพัฒนาแอปทราบว่าแอปจะเริ่มกิจกรรม

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

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

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

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

  • PendingIntent จะเริ่มได้ทุกเมื่อที่แอปที่สร้างมองเห็นได้
  • PendingIntent จะเริ่มได้ทุกเมื่อหากแอปที่สร้างมีสิทธิ์พิเศษ

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

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

โหมดเข้มงวด

ตั้งแต่ Android 16 เป็นต้นไป นักพัฒนาแอปสามารถเปิดใช้ โหมดเข้มงวด เพื่อรับ การแจ้งเตือนเมื่อมีการบล็อกการเปิดกิจกรรม (หรือมีความเสี่ยงที่จะถูกบล็อกเมื่อ มีการเพิ่ม SDK เป้าหมายของแอป)

ตัวอย่างโค้ดเพื่อเปิดใช้จากเมธอด Application.onCreate() ของแอปพลิเคชัน กิจกรรม หรือคอมโพเนนต์แอปพลิเคชันอื่นๆ ในช่วงแรก

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

อ่านรายละเอียดเพิ่มเติมได้ในเอกสารประกอบเกี่ยวกับโหมดเข้มงวด