Android 10 (API ระดับ 29) ขึ้นไปจะจำกัดเวลาที่แอปสามารถเริ่มกิจกรรมได้เมื่อแอปทำงานในเบื้องหลัง ข้อจำกัดเหล่านี้ช่วยลดการหยุดชะงักของผู้ใช้และ ช่วยให้ผู้ใช้ควบคุมสิ่งที่แสดงบนหน้าจอได้มากขึ้น
คู่มือนี้จะนำเสนอการแจ้งเตือนเป็นทางเลือกในการเริ่มกิจกรรมจากเบื้องหลัง นอกจากนี้ ยังแสดงรายการกรณีเฉพาะที่ไม่มีการใช้ข้อจำกัด
แสดงการแจ้งเตือนแทน
ในเกือบทุกกรณี แอปที่ทำงานในเบื้องหลังต้องแสดงการแจ้งเตือนที่คำนึงถึงเวลาเพื่อ ให้ข้อมูลเร่งด่วนแก่ผู้ใช้แทนที่จะเริ่มกิจกรรมโดยตรง การแจ้งเตือนดังกล่าวรวมถึงการรับสายโทรศัพท์ที่โทรเข้ามาหรือการปิดนาฬิกาปลุกที่ทำงานอยู่
ระบบการแจ้งเตือนและการช่วยเตือนที่อิงตามการแจ้งเตือนนี้มีข้อดีหลายประการ สำหรับผู้ใช้ ดังนี้
- เมื่อใช้อุปกรณ์ ผู้ใช้จะเห็นการแจ้งเตือนแบบลอยที่ช่วยให้ตอบกลับได้ ผู้ใช้จะยังคงใช้บริบทปัจจุบันและควบคุมเนื้อหาที่เห็นบนหน้าจอได้
- การแจ้งเตือนที่ต้องดำเนินการอย่างเร่งด่วนจะปฏิบัติตามกฎโหมดห้ามรบกวนของผู้ใช้ เช่น ผู้ใช้อาจอนุญาตให้รับสายจากรายชื่อติดต่อที่เฉพาะเจาะจงหรือจากผู้โทรซ้ำเท่านั้นเมื่อเปิดใช้โหมดห้ามรบกวน
- เมื่อหน้าจอของอุปกรณ์ปิดอยู่ ระบบจะเปิดใช้ Intent แบบเต็มหน้าจอ ทันที
- ในหน้าจอการตั้งค่าของอุปกรณ์ ผู้ใช้จะดูได้ว่าแอปใดส่งการแจ้งเตือนล่าสุด รวมถึงจากช่องทางการแจ้งเตือนที่เฉพาะเจาะจง จากหน้าจอนี้ ผู้ใช้จะควบคุมค่ากำหนดการแจ้งเตือนได้
เมื่อแอปเริ่มกิจกรรมได้
แอปที่ทำงานบน Android 10 ขึ้นไปจะเริ่มกิจกรรมได้เมื่อเป็นไปตามเงื่อนไขต่อไปนี้อย่างน้อย 1 รายการ
- แอปมีหน้าต่างที่มองเห็นได้ เช่น กิจกรรมในเบื้องหน้า
- แอปมีกิจกรรมใน สแต็กย้อนกลับของ งานที่ทำงานอยู่เบื้องหน้า
แอปมีกิจกรรมในกองซ้อนย้อนกลับของงานที่มีอยู่บนหน้าจอล่าสุด
แอปมีกิจกรรมที่เพิ่งเริ่มต้นเมื่อเร็วๆ นี้
แอปชื่อ
finish()ได้เข้าถึง กิจกรรมเมื่อเร็วๆ นี้ ซึ่งจะใช้ได้ก็ต่อเมื่อแอปมีกิจกรรมในเบื้องหน้าหรือกิจกรรมในกองซ้อนย้อนกลับของงานเบื้องหน้าที่เวลาเรียกใช้finish()แอปมีบริการอย่างใดอย่างหนึ่งต่อไปนี้ที่ระบบผูกไว้ บริการเหล่านี้ อาจต้องเปิด UI
AccessibilityServiceAutofillServiceCallRedirectionServiceHostApduServiceInCallServiceTileService(ใช้ไม่ได้ใน Android 14 (API ระดับ 34) ขึ้นไป)VoiceInteractionServiceVrListenerService
แอปมีบริการที่เชื่อมโยงกับแอปอื่นที่มองเห็นได้ แอปที่เชื่อมโยงกับบริการต้องยังคงมองเห็นได้เพื่อให้แอปในเบื้องหลังเริ่มกิจกรรมได้สำเร็จ
แอปจะได้รับการแจ้งเตือน
PendingIntentจากระบบ ในกรณีของ PendingIntent สำหรับบริการและ BroadcastReceiver แอปจะเริ่มกิจกรรมได้เป็นเวลา 2-3 วินาทีหลังจากที่ส่ง PendingIntentแอปได้รับ
PendingIntentที่ส่งจากแอปอื่นที่มองเห็นได้แอปจะได้รับการออกอากาศของระบบซึ่งคาดว่าแอปจะเปิดตัว UI ตัวอย่างเช่น
ACTION_NEW_OUTGOING_CALLและSECRET_CODE_ACTIONแอปสามารถเริ่มกิจกรรมได้ในไม่กี่วินาทีหลังจากส่งการออกอากาศแอปเชื่อมโยงกับอุปกรณ์ฮาร์ดแวร์ที่ใช้ร่วมกันผ่าน
CompanionDeviceManagerAPI API นี้ช่วยให้แอปเริ่มกิจกรรมเพื่อตอบสนองต่อการดำเนินการที่ผู้ใช้ทำในอุปกรณ์ที่จับคู่ไว้แอปเป็นเครื่องมือควบคุมนโยบายด้านอุปกรณ์ที่ทำงานในโหมดเจ้าของอุปกรณ์ ตัวอย่างกรณีการใช้งาน ได้แก่ อุปกรณ์ขององค์กรที่จัดการอย่างเต็มรูปแบบ รวมถึงอุปกรณ์เฉพาะ เช่น ป้ายดิจิทัล และคีออสก์
ผู้ใช้ให้สิทธิ์
SYSTEM_ALERT_WINDOWแก่แอป
ต้องเลือกใช้เมื่อเริ่มกิจกรรมจาก PendingIntent
ตั้งแต่ Android 14 เป็นต้นไป จะมี API ที่ชัดเจนซึ่งช่วยให้คุณเลือกรับหรือเลือกไม่รับการให้สิทธิ์แอปในการเริ่มกิจกรรม เพื่อหลีกเลี่ยงการอนุญาตให้เริ่มกิจกรรมโดยไม่ตั้งใจตามเงื่อนไขที่ระบุ
แอปที่กำหนดเป้าหมายเป็น Android 15 ขึ้นไปจะไม่มีการให้สิทธิ์เปิดกิจกรรมในเบื้องหลัง (BAL) แก่ PendingIntents ที่สร้างขึ้นโดยค่าเริ่มต้นอีกต่อไป ต้องมีการเลือกใช้อย่างชัดเจน หากต้องการดำเนินการดังกล่าว คุณจะมีตัวเลือกต่อไปนี้
ขึ้นอยู่กับว่าแอปกำลังส่งหรือสร้าง PendingIntents
โดยผู้ส่งของ 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() หรือเมธอดที่คล้ายกัน
อ่านรายละเอียดเพิ่มเติมในเอกสารอ้างอิงที่เกี่ยวข้อง
ActivityOptions.setPendingIntentBackgroundActivityStartModeActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
โหมดเข้มงวด
ตั้งแต่ Android 16 เป็นต้นไป นักพัฒนาแอปสามารถเปิดใช้โหมดเข้มงวดเพื่อรับการแจ้งเตือนเมื่อการเปิดใช้กิจกรรมถูกบล็อก (หรือมีความเสี่ยงที่จะถูกบล็อกเมื่อมีการเพิ่ม SDK เป้าหมายของแอป)
ตัวอย่างโค้ดเพื่อเปิดใช้ตั้งแต่เนิ่นๆ ในแอปพลิเคชัน กิจกรรม หรือคอมโพเนนต์อื่นๆ ของแอปพลิเคชันApplication.onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
อ่านรายละเอียดเพิ่มเติมได้ในเอกสารประกอบเกี่ยวกับโหมดเข้มงวด