إذا كان التطبيق يستهدف الإصدار 15 من نظام التشغيل Android أو الإصدارات الأحدث، يفرض النظام قيودًا على المدة التي يُسمح فيها بتشغيل بعض الخدمات التي تعمل في المقدّمة أثناء عمل تطبيقك في الخلفية. في الوقت الحالي، لا ينطبق هذا القيد إلا على الخدمات التي تعمل في المقدّمة من النوعين 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".
الاختبار
لاختبار سلوك تطبيقك، يمكنك تفعيل مهلات مزامنة البيانات حتى إذا كان تطبيقك لا يستهدف الإصدار 15 من نظام التشغيل Android (طالما أنّ التطبيق يعمل على جهاز 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