انتهاء مهلة الخدمة التي تعمل في المقدّمة

إذا كان التطبيق يستهدف الإصدار 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]"

لتجنُّب المشاكل المرتبطة بهذا التغيير في السلوك، يمكنك تنفيذ إجراء واحد أو أكثر مما يلي:

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