إذا كان أحد التطبيقات يستهدف الإصدار 15 من نظام التشغيل Android أو إصدارًا أحدث، يفرض النظام قيودًا على المدة المسموح بها لتشغيل بعض الخدمات التي تعمل في المقدّمة عندما يكون تطبيقك في الخلفية. في الوقت الحالي، لا ينطبق هذا الشرط إلا على خدمات dataSync
وmediaProcessing
نوع الخدمة التي تعمل في المقدّمة فقط. هناك حدود أكثر تقييدًا على نوع الخدمة التي تعمل في المقدّمة من shortService
والتي تتم مناقشتها في مستندات نوع الخدمة هذا.
سلوك المهلة
يسمح النظام بتشغيل الخدمات التي تعمل في المقدّمة dataSync
وmediaProcessing
لمدة إجمالية تبلغ 6 ساعات خلال فترة 24 ساعة، وبعد ذلك يستدعي النظام Service.onTimeout(int, int)
(تم تقديمها في Android 15)
للخدمة التي تعمل في المقدّمة. (تمّت إضافة نوع الخدمةmediaProcessing
التي تعمل في
المقدّمة في الإصدار Android 15). يتم تتبُّع الحد الزمني البالغ ست ساعات
بشكل منفصل لكل من dataSync
وخدمات mediaProcessing
. على سبيل المثال، إذا كانت إحدى خدمات dataSync
تعمل لمدة ساعة واحدة، لن تتوفّر في التطبيق سوى خمس ساعات لخدمات mediaProcessing
التي تعمل في المقدّمة، ولكن سيتوفّر ست ساعات كاملة لخدمات dataSync
.
عند بلوغ الخدمة التي تعمل في المقدّمة الحدّ الأقصى البالغ ست ساعات، يكون لدى الخدمة بضع ثوانٍ للاتصال بـ Service.stopSelf()
. عندما يُطلِق النظام علامة
Service.onTimeout()
، تصبح الخدمة غير خدمة تعمل في المقدّمة.
إذا لم تطلب الخدمة Service.stopSelf()
، يُرسِل النظام
استثناءً داخليًا. يتم تسجيل الاستثناء في Logcat مع الرسالة التالية:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
لتجنُّب المشاكل المتعلّقة بهذا التغيير في السلوك، يمكنك اتّخاذ إجراء أو أكثر من الإجراءات التالية:
- اطلب من مقدّم الخدمة تنفيذ طريقة
Service.onTimeout(int, int)
الجديدة. عندما يتلقّى تطبيقك معاودة الاتصال، احرص على الاتصال بـstopSelf()
في غضون بضع ثوانٍ. (إذا لم توقف التطبيق على الفور، سيُنشئ النظام حالة تعطُّل.) - تأكَّد من عدم تشغيل خدمتَي
dataSync
وmediaProcessing
في تطبيقك مدّة تزيد عن 6 ساعات في أي فترة مدتها 24 ساعة (ما لم يتفاعل المستخدم مع التطبيق، فسيتم إعادة ضبط الموقّت). - لا تبدأ خدمات
dataSync
أوmediaProcessing
التي تعمل في المقدّمة إلا نتيجة تفاعل المستخدم المباشر، لأنّ تطبيقك يكون في المقدّمة عند بدء الخدمة، وبالتالي تتوفر لخدمتك ست ساعات كاملة بعد انتقال التطبيق إلى الخلفية. - بدلاً من استخدام هذه الخدمات التي تعمل في المقدّمة، استخدِم واجهة برمجة تطبيقات
بديلة، مثل WorkManager. على وجه الخصوص، بدلاً من استخدام
dataSync
خدمة تعمل في المقدّمة، ننصحك باستخدام واجهة برمجة تطبيقات بديلة.
إذا تم تشغيل خدمات dataSync
التي تعمل في المقدّمة ضمن تطبيقك لمدة 6 ساعات خلال آخر 24،
لا يمكنك بدء خدمة dataSync
أخرى تعمل في المقدّمة ما لم يجلب المستخدم تطبيقك إلى المقدّمة (ما يؤدي إلى إعادة ضبط الموقّت). إذا حاولت
بدء dataSync
خدمة أخرى تعمل في المقدّمة، يُرسِل النظام
ForegroundServiceStartNotAllowedException
رسالة خطأ مثل "انتهت المهلة الزمنية للخدمة التي تعمل في المقدّمة
من النوع dataSync".
الاختبار
لاختبار سلوك تطبيقك، يمكنك تفعيل مهلات مزامنة البيانات حتى إذا كان تطبيقك
لا يستهدف الإصدار 15 من نظام التشغيل Android (ما دام التطبيق يعمل على جهاز يعمل بالإصدار 15 من نظام التشغيل Android). لتفعيل مهلات الانتظار، شغِّل الأمر adb
التالي:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
يمكنك أيضًا تعديل فترة المهلة لتسهيل اختبار سلوك
تطبيقك عند بلوغ الحدّ الأقصى. لضبط فترة مهلة جديدة لخدمات
dataSync
التي تعمل في المقدّمة، شغِّل الأمر adb
التالي:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
لضبط مدة مهلة جديدة لخدمات mediaProcessing
التي تعمل في المقدّمة، شغِّل الأمر التالي:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds