การปลุกในเวลาที่แน่นอนมีไว้สำหรับการแจ้งเตือนที่จงใจของผู้ใช้ หรือการกระทำที่ต้องการ ในช่วงเวลาที่เจาะจง
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
)
ทุนการศึกษาก่อน
- ผู้ถือบทบาท
SYSTEM_WELLBEING
จะได้รับมอบหมายบทบาทSCHEDULE_EXACT_ALARM
ล่วงหน้า
หลักเกณฑ์การตรวจหาเชื้อไวรัส
หากต้องการทดสอบการเปลี่ยนแปลงนี้ ให้ปิดใช้สิทธิ์การปลุกและการช่วยเตือนสำหรับแอปจากหน้าสิทธิ์เข้าถึงพิเศษของแอปในการตั้งค่าระบบ (การตั้งค่า > แอป > สิทธิ์เข้าถึงพิเศษของแอป > การปลุกและการช่วยเตือน) แล้วสังเกตลักษณะการทำงานของแอป