ระบบจะปฏิเสธการตั้งเวลาปลุกในเวลาที่แน่นอนโดยค่าเริ่มต้น

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

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 ขึ้นไป การเปลี่ยนแปลงนี้จะส่งผลต่อแอปที่ติดตั้งใหม่ซึ่งมีลักษณะต่อไปนี้

แอปปฏิทินและนาฬิกาปลุกควรประกาศ 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

ซึ่งจะเหมือนกับเวิร์กโฟลว์มาตรฐานสำหรับการขอ สิทธิ์

  1. แอปควรโทรหา AlarmManager.canScheduleExactAlarms() เพื่อยืนยัน ว่าได้รับสิทธิ์ที่เหมาะสม
  2. หากแอปไม่มีสิทธิ์ ให้เรียกใช้ Intent ที่มี ACTION_REQUEST_SCHEDULE_EXACT_ALARM พร้อมกับชื่อแพ็กเกจของแอปเพื่อขอให้ผู้ใช้ให้สิทธิ์

    ตรวจสอบการตัดสินใจของผู้ใช้ในonResume()วิธี แอป

  3. ฟังภาษา AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED การบรอดแคสต์ข้อความที่จะส่งไปหากผู้ใช้ให้สิทธิ์

  4. หากผู้ใช้ให้สิทธิ์แก่แอปของคุณ แอปจะตั้งปลุกในเวลาที่แน่นอนได้ หากผู้ใช้ปฏิเสธสิทธิ์ ให้ลดระดับประสบการณ์การใช้งานแอปอย่างราบรื่นเพื่อให้แอปทำงานได้โดยมีฟังก์ชันการทำงานแก่ผู้ใช้โดยไม่มีข้อมูลที่ได้รับความคุ้มครองจากสิทธิ์นั้น

ข้อมูลโค้ดต่อไปนี้แสดงวิธีตรวจสอบสิทธิ์ 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 ล่วงหน้า

หลักเกณฑ์การตรวจหาเชื้อไวรัส

หากต้องการทดสอบการเปลี่ยนแปลงนี้ ให้ปิดใช้สิทธิ์การปลุกและการช่วยเตือนสำหรับแอปจากหน้าสิทธิ์เข้าถึงพิเศษของแอปในการตั้งค่าระบบ (การตั้งค่า > แอป > สิทธิ์เข้าถึงพิเศษของแอป > การปลุกและการช่วยเตือน) แล้วสังเกตลักษณะการทำงานของแอป