يتم تلقائيًا رفض المنبّهات المحدَّدة الوقت.

تكون المنبّهات الدقيقة مخصّصة للإشعارات أو الإجراءات التي يريدها المستخدم والتي يجب أن تحدث في وقت محدد.

SCHEDULE_EXACT_ALARM، وهو الإذن الذي تم تقديمه في الإصدار 12 من نظام التشغيل Android للتطبيقات جدولة المنبّهات المحددة الوقت، لم يعد يتم منحها مسبقًا إلى الأجهزة التي تم تثبيتها حديثًا التطبيقات التي تستهدف الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث (سيتم ضبطها على "مرفوضة" تلقائيًا) في حال حذف نقل المستخدم بيانات التطبيق إلى جهاز يعمل بنظام التشغيل Android 14 من خلال عملية النسخ الاحتياطي والاستعادة، فسيظل الإذن مرفوضًا. إذا كانت لدى التطبيق الحالي هذا الإذن، وسيتم منحه مسبقًا عندما يكون الجهاز الترقيات إلى Android 14

يجب الحصول على إذن SCHEDULE_EXACT_ALARM لبدء المنبّهات المحدَّدة الوقت من خلال واجهات برمجة التطبيقات التالية، وإلا سيتم طرح SecurityException:

لا تزال أفضل الممارسات الحالية لإذن SCHEDULE_EXACT_ALARM التطبيق، بما في ذلك ما يلي:

  • يُرجى التحقّق من الإذن من خلال canScheduleExactAlarms() قبل تحديد الموعد. المنبّهات المحدَّدة الوقت.
  • عليك إعداد تطبيقك للاستماع إلى البث في المقدّمة والتفاعل معه بشكلٍ سليم، وهو البث الذي يرسله النظام عندما يمنح المستخدم الإذن. AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED

التطبيقات المتأثِّرة

إذا كان الجهاز يعمل بالإصدار 14 من Android أو إصدار أحدث، سيؤثّر هذا التغيير في التطبيق الذي تم تثبيته حديثًا والذي يتسم بالخصائص التالية:

  • يستهدف هذا الإصدار نظام التشغيل Android 13 (المستوى 33) أو الإصدارات الأحدث.
  • يُستخدَم لتعريف الإذن SCHEDULE_EXACT_ALARM في البيان.
  • لا يندرج ضمن سيناريو إعفاء أو منحة مسبقة .
  • ليس تطبيق تقويم أو منبه.

يجب أن تشير تطبيقات التقويم والمنبّهات إلى استخدام الإذن USE_EXACT_ALARM.

يجب أن ترسل تطبيقات التقويم أو المنبّهات تذكيرات التقويم أو المنبّهات للاستيقاظ أو التنبيهات عندما لا يكون التطبيق قيد التشغيل. يمكن لهذه التطبيقات طلب الإذن العادي USE_EXACT_ALARM. سيتم منح إذن USE_EXACT_ALARM عند التثبيت، وستتمكّن التطبيقات التي تمتلك هذا الإذن من جدولة إنذارات دقيقة تمامًا مثل التطبيقات التي تمتلك إذن SCHEDULE_EXACT_ALARM.

حالات الاستخدام التي قد لا تتطلّب منبّهات محدَّدة الوقت

نظرًا لأنه تم رفض إذن SCHEDULE_EXACT_ALARM تلقائيًا الآن تتطلب عملية منح الأذونات خطوات إضافية من المستخدمين، فإن المطورين ننصح بشدة بتقييم حالات الاستخدام وتحديد ما إذا كانت المنبّهات المحدَّدة الوقت منطقية لحالات الاستخدام الخاصة بها.

تعرض القائمة التالية سير العمل الشائع الذي قد لا يتطلّب منبّهًا محدَّدًا:

جدولة مهام متكررة خلال مدة استخدام تطبيقك
تكون طريقة set() مفيدة إذا كانت المهمة تتطلّب مراعاة قيود الوقت الفعلي، مثل إيقافها في الساعة 2:00 بعد الظهر غدًا أو بعد 30 دقيقة. بخلاف ذلك، ننصحك باستخدام postAtTime() أو postDelayed() طريقة بدلاً من ذلك.
الأعمال التي تم إجراؤها في الخلفية، مثل تحديث التطبيق وتحميل السجلّات
توفّر ميزة WorkManager طريقة لجدولة أعمال دورية تتضمّن التوقيت المناسب. يمكنك توفير فاصل متكرر وflexInterval (15 دقيقة كحد أدنى) وتحدّد وقت تشغيل دقيق للعمل.
يجب تفعيل منبّه ليرنّ في وقت تقريبي عندما يكون النظام في وضع عدم النشاط.
استخدام منبّه غير دقيق يُرجى الاتصال بالرقم setAndAllowWhileIdle().
إجراء يحدّده المستخدم من المفترض أن يحدث بعد وقت محدّد
يُرجى استخدام منبّه غير محدَّد. يُرجى الاتصال بالرقم set().
إجراء يحدده المستخدم ويمكن أن يحدث في فترة زمنية
استخدام منبّه غير دقيق على وجه التحديد، الاتصال بـ setWindow(). يُرجى العِلم أنّ أقصر مدة مسموح بها هي 10 دقائق.

خطوات نقل البيانات لمواصلة استخدام المنبّهات المحدَّدة الوقت

على التطبيقات التحقّق على الأقل ممّا إذا كانت تملك الإذن قبل جدولة المنبّهات المحدَّدة الوقت. إذا لم تكن التطبيقات تملك الإذن، عليها أن تطلبه من المستخدم من خلال استدعاء نية.

هذا الأمر مماثل لسير العمل القياسي لطلب رقم تعريف شخصي الإذن:

  1. يجب أن تتصل التطبيقات بالرقم AlarmManager.canScheduleExactAlarms() لتأكيد أنّها تمتلك الإذن المناسب.
  2. إذا لم يكن لدى التطبيق الإذن، يمكنك استدعاء نية تتضمّن 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(...)
   }
}

خفض الترتيب بشكل تدريجي عند رفض الإذن

سيرفض بعض المستخدمين منح الإذن. في هذا السيناريو، نوصي تعمل على خفض مستوى التجربة بشكل سلس ومواصلة السعي لتقديم أفضل تجربة المستخدم الاحتياطية المحتملة من خلال تحديد حالات الاستخدام لديه.

الإعفاءات

يُسمح دائمًا للأنواع التالية من التطبيقات باستدعاء الطريقتَين setExact() أو setExactAndAllowWhileIdle():

  • التطبيقات الموقَّعة باستخدام شهادة النظام الأساسي
  • التطبيقات المميّزة
  • التطبيقات المدرَجة في القائمة المسموح بها للتطبيقات التي تتطلب إذن الوصول إلى الموارد العالية (إذا كان تطبيقك يستوفي المتطلبات، يمكنك طلب ذلك باستخدام ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS إجراء النية).

المنح المُسبَقة

إرشادات الاختبار

لاختبار هذا التغيير، قم بإيقاف تشغيل المنبّهات إذن التذكيرات في تطبيقك من صفحة أذونات خاصة للتطبيقات في إعدادات النظام (الإعدادات > التطبيقات > أذونات خاصة للتطبيقات > المنبّهات تذكيرات) ومراقبة سلوك تطبيقك.