การปลุกในเวลาที่แน่นอนมีไว้สำหรับการแจ้งเตือนที่จงใจของผู้ใช้ หรือการทำงานที่จำเป็น ในช่วงเวลาที่เจาะจง
SCHEDULE_EXACT_ALARM
สิทธิ์ที่เปิดตัวใน Android 12 สำหรับแอปต่างๆ
ตั้งเวลาปลุกในเวลาที่แน่นอน ไม่ได้รับสิทธิ์ล่วงหน้าจากการติดตั้งใหม่อีกแล้ว
แอปที่กำหนดเป้าหมายเป็น Android 13 ขึ้นไป (จะปฏิเสธโดยค่าเริ่มต้น) ถ้า
ผู้ใช้โอนข้อมูลแอปไปยังอุปกรณ์ที่ใช้ Android 14 ผ่าน
การสำรองและกู้คืนข้อมูล สิทธิ์จะยังคงถูกปฏิเสธ หากมี
แอปที่มีอยู่จะมีสิทธิ์นี้อยู่แล้ว ซึ่งจะได้รับอนุญาตล่วงหน้าเมื่ออุปกรณ์
อัปเกรดเป็น Android 14
ต้องมีสิทธิ์ SCHEDULE_EXACT_ALARM
เพื่อเริ่มการปลุกในเวลาที่แน่นอน
ผ่าน API ต่อไปนี้หรือจะส่ง SecurityException
:
ยังคงแนวทางปฏิบัติแนะนำที่มีอยู่สำหรับสิทธิ์ SCHEDULE_EXACT_ALARM
อยู่
ที่เกี่ยวข้อง ซึ่งรวมถึง
- โปรดตรวจสอบสิทธิ์จาก
canScheduleExactAlarms()
ก่อนกำหนดเวลา การตั้งปลุกในเวลาที่แน่นอน - ตั้งค่าแอปให้ฟังและตอบสนองต่อการออกอากาศในเบื้องหน้าได้อย่างเหมาะสม
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
ซึ่งระบบจะส่งเมื่อผู้ใช้ให้สิทธิ์
แอปที่ได้รับผลกระทบ
หากอุปกรณ์ที่ใช้ Android 14 ขึ้นไป การเปลี่ยนแปลงนี้จะมีผลต่อ แอปที่ติดตั้งที่มีลักษณะดังต่อไปนี้
- กำหนดเป้าหมายเป็น Android 13 (API ระดับ 33) ขึ้นไป
- ประกาศสิทธิ์
SCHEDULE_EXACT_ALARM
ในไฟล์ Manifest - ไม่ได้รับการยกเว้นหรือให้สิทธิ์ล่วงหน้า สถานการณ์
- ไม่ใช่แอปปฏิทินหรือนาฬิกาปลุก
แอปปฏิทินและนาฬิกาปลุกควรแจ้ง USE_EXACT_ALARM
แอปปฏิทินหรือนาฬิกาปลุกต้องส่งการช่วยเตือนในปฏิทิน, การปลุก
การปลุก หรือการแจ้งเตือนเมื่อแอปไม่ได้ทำงานแล้ว แอปเหล่านี้สามารถขอ
USE_EXACT_ALARM
สิทธิ์ปกติ สิทธิ์ USE_EXACT_ALARM
จะ
ได้รับสิทธิ์เมื่อติดตั้ง และแอปที่มีสิทธิ์นี้จะสามารถกำหนดเวลา
การปลุกในเวลาที่แน่นอนเหมือนกับแอปที่มีสิทธิ์ SCHEDULE_EXACT_ALARM
กรณีการใช้งานที่อาจไม่ต้องการการปลุกในเวลาที่แน่นอน
เนื่องจากตอนนี้สิทธิ์ SCHEDULE_EXACT_ALARM
ถูกปฏิเสธโดยค่าเริ่มต้นและ
กระบวนการให้สิทธิ์ต้องมีขั้นตอนเพิ่มเติมจากผู้ใช้ นักพัฒนาซอฟต์แวร์
แนะนำให้ประเมินกรณีการใช้งานและระบุว่าการปลุกในเวลาที่แน่นอน
ยังคงเหมาะสำหรับ
กรณีการใช้งานของพวกเขา
รายการต่อไปนี้แสดงเวิร์กโฟลว์ทั่วไปที่อาจไม่ต้องการการปลุกในเวลาที่แน่นอน
- การกำหนดเวลางานที่ทำซ้ำในระหว่างอายุการใช้งานของแอป
- เมธอด
set()
มีประโยชน์เมื่อต้องทำให้งานเป็นแบบเรียลไทม์ ที่ต้องคำนึงถึง เช่น ออกเดินทางเวลา 14:00 น. ของพรุ่งนี้ หรือใน 30 นาที หากไม่มี ขอแนะนำให้ใช้postAtTime()
หรือpostDelayed()
เมธอดแทน - งานในเบื้องหลังที่กำหนดเวลาไว้ เช่น การอัปเดตแอปและอัปโหลดบันทึก
WorkManager
ช่วยให้คุณสามารถกำหนดเวลางานที่มีกำหนดเวลาซึ่งในการดำเนินการต่างๆ คุณสามารถระบุช่วงการทำซ้ำและ flexInterval (ต่ำสุด 15 นาที) เพื่อ กำหนดรันไทม์แบบละเอียดสำหรับงาน- ต้องปิดเสียงปลุกในเวลาโดยประมาณขณะที่ระบบอยู่ในสถานะไม่มีการใช้งาน
- ใช้การปลุกในเวลาที่ไม่แน่นอน กล่าวโดยเจาะจงคือโทรไปที่
setAndAllowWhileIdle()
- การดำเนินการที่ผู้ใช้ระบุที่ควรเกิดขึ้นหลังจากเวลาที่ระบุ
- ใช้การปลุกในเวลาที่ไม่แน่นอน กล่าวโดยเจาะจงคือโทรไปที่
set()
- การดำเนินการที่ผู้ใช้ระบุซึ่งอาจเกิดขึ้นได้ภายในกรอบเวลา
- ใช้การปลุกในเวลาที่ไม่แน่นอน กล่าวโดยเจาะจงคือโทรไปที่
setWindow()
โปรดทราบว่า ความยาวของหน้าต่างที่เล็กที่สุดที่อนุญาตคือ 10 นาที
ขั้นตอนการย้ายข้อมูลเพื่อใช้การปลุกในเวลาที่แน่นอนต่อไป
อย่างน้อยที่สุด แอปต้องตรวจสอบว่าตนเองมีสิทธิ์ก่อน กำลังตั้งนาฬิกาปลุกในเวลาที่แน่นอน หากแอปไม่มีสิทธิ์ ก็ต้องขอสิทธิ์ จากผู้ใช้ด้วยการเรียกใช้ Intent
ซึ่งจะเหมือนกับเวิร์กโฟลว์มาตรฐานสำหรับการขอข้อเสนอพิเศษ สิทธิ์
- แอปควรโทรหา
AlarmManager.canScheduleExactAlarms()
เพื่อยืนยัน ว่าได้รับสิทธิ์ที่เหมาะสม หากแอปไม่มีสิทธิ์ ให้เรียกใช้ Intent ที่มี
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
พร้อมแพ็กเกจของแอป เพื่อขอให้ผู้ใช้ให้สิทธิ์ดังกล่าวตรวจสอบการตัดสินใจของผู้ใช้ใน
onResume()
วิธี แอปฟังภาษา
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
การบรอดแคสต์ข้อความที่จะส่งไปหากผู้ใช้ให้สิทธิ์หากผู้ใช้ให้สิทธิ์แอปของคุณ แอปจะสามารถตั้ง การปลุก หากผู้ใช้ปฏิเสธการอนุญาตแทน ให้ลดระดับอย่างสุภาพ ประสบการณ์การใช้งานแอป ซึ่งมีฟังก์ชัน ผู้ใช้โดยไม่มีข้อมูลที่มีการป้องกันโดยสิทธิ์นั้น
ข้อมูลโค้ดต่อไปนี้แสดงวิธีตรวจหา
สิทธิ์ SCHEDULE_EXACT_ALARM
:
val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
// If permission is granted, proceed with scheduling exact alarms.
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// Ask users to go to exact alarm page in system settings.
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
โค้ดตัวอย่างสำหรับตรวจสอบสิทธิ์และจัดการการตัดสินใจของผู้ใช้
onResume()
:
override fun onResume() {
…
if (alarmManager.canScheduleExactAlarms()) {
// Set exact alarms.
alarmManager.setExact(...)
}
else {
// Permission not yet approved. Display user notice and revert to a fallback
// approach.
alarmManager.setWindow(...)
}
}
ลดระดับอย่างค่อยเป็นค่อยไปเมื่อมีการปฏิเสธสิทธิ์
ผู้ใช้บางรายจะปฏิเสธที่จะให้สิทธิ์ดังกล่าว ในสถานการณ์นี้ เราขอแนะนำ แอปเพื่อลดระดับประสบการณ์การใช้งานอย่างแนบเนียนและยังคงพยายามนำเสนอสิ่งที่ดีที่สุด ประสบการณ์ของผู้ใช้ทางเลือกที่เป็นไปได้โดยการระบุ Use Case ของผู้ใช้
การยกเว้น
แอปประเภทต่อไปนี้ได้รับอนุญาตให้เรียก setExact()
หรือ
setExactAndAllowWhileIdle()
เมธอด:
- แอปที่ลงนามด้วยใบรับรองแพลตฟอร์ม
- แอปที่ได้รับสิทธิ์
- แอปที่อยู่ในรายการรายการที่อนุญาตสําหรับขั้นสูง (หากแอปของคุณเป็นไปตามข้อกําหนด คุณจะ
สามารถขอข้อมูลนี้โดยใช้
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
การดำเนินการ Intent)
ทุนการศึกษาก่อน
- เจ้าของบทบาทของ
SYSTEM_WELLBEING
จะได้รับอนุญาตล่วงหน้าSCHEDULE_EXACT_ALARM
หลักเกณฑ์การตรวจหาเชื้อไวรัส
หากต้องการทดสอบการเปลี่ยนแปลงนี้ ให้ปิดใช้การปลุกและ สิทธิ์การช่วยเตือนสำหรับแอปของคุณ จากหน้าสิทธิ์เข้าถึงพิเศษของแอปในการตั้งค่าระบบ (การตั้งค่า > แอป > สิทธิ์เข้าถึงพิเศษของแอป > การปลุกและ การช่วยเตือน) และสังเกตลักษณะการทำงานของแอป