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

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

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

  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 (ما دام التطبيق يعمل على جهاز يعمل بالإصدار 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