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

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

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():

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

المِنح المسبقة

  • سيتم منح أصحاب الأدوار في SYSTEM_WELLBEING مسبقًا. SCHEDULE_EXACT_ALARM

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

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