默认拒绝设定精确的闹钟

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

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 การดำเนินการ Intent)

ทุนการศึกษาก่อน

  • เจ้าของบทบาทของ SYSTEM_WELLBEING จะได้รับอนุญาตล่วงหน้า SCHEDULE_EXACT_ALARM

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

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