إذا كان التطبيق يستهدف Android 15 أو الإصدارات الأحدث، يفرض النظام قيودًا على المدة المسموح فيها بتشغيل خدمات معيّنة تعمل في المقدّمة أثناء تشغيل تطبيقك في الخلفية. في الوقت الحالي، لا ينطبق هذا القيد إلا على
dataSync و
mediaProcessing من النوعَين من الخدمات التي تعمل في المقدّمة. تفرض الخدمات التي تعمل في المقدّمة من النوع shortService حدودًا أكثر تقييدًا، ويتم تناولها في مستندات هذا النوع من الخدمات.
سلوك المهلة
يسمح النظام بتشغيل الخدمات التي تعمل في المقدّمة من النوعَين dataSync وmediaProcessing لمدة 6 ساعات إجمالاً خلال فترة 24 ساعة، وبعد ذلك يستدعي النظام طريقة Service.onTimeout(int, int) للخدمة قيد التشغيل (التي تم طرحها في Android 15). (تمت إضافة نوع الخدمة التي تعمل في المقدّمة mediaProcessing في Android 15). يتم تتبُّع الحدّ الزمني البالغ ست ساعات بشكل منفصل لخدمات dataSync وmediaProcessing. على سبيل المثال، إذا تم تشغيل خدمة dataSync لمدة ساعة واحدة فقط، لن يتوفّر للتطبيق سوى خمس ساعات للخدمات التي تعمل في المقدّمة من النوع dataSync، ولكن سيتوفّر له ست ساعات كاملة للخدمات من النوع mediaProcessing.
عندما تصل خدمة تعمل في المقدّمة إلى الحدّ الزمني البالغ ست ساعات، يكون أمامها بضع ثوانٍ
لاستدعاء 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".
الاختبار
لاختبار سلوك تطبيقك، يمكنك تفعيل مهلات مزامنة البيانات حتى إذا كان تطبيقك لا يستهدف Android 15 (طالما أنّ التطبيق قيد التشغيل على جهاز Android 15). لتفعيل المهلات، شغِّل أمر 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