القيود المفروضة على بدء خدمة تعمل في المقدّمة من الخلفية

لا يمكن للتطبيقات التي تستهدف الإصدار 12 من Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث بدء خدمات تعمل في المقدّمة أثناء تشغيل التطبيق في الخلفية، باستثناء بعض الحالات الخاصة. إذا حاول أحد التطبيقات بدء خدمة تعمل في المقدّمة أثناء تشغيل التطبيق في الخلفية، ولم تستوفِ الخدمة التي تعمل في المقدّمة أحد الحالات الاستثنائية، يُرسِل النظام ForegroundServiceStartNotAllowedException.

بالإضافة إلى ذلك، إذا أراد أحد التطبيقات تشغيل خدمة تعمل في المقدّمة وتحتاج إلى أذونات أثناء الاستخدام (مثل أذونات جهاز استشعار الجسم أو الكاميرا أو الميكروفون أو الموقع الجغرافي)، لا يمكنه إنشاء الخدمة عندما يكون التطبيق قيد التشغيل في الخلفية، حتى إذا كان التطبيق يندرج ضمن أحد الاستثناءات من قيود بدء التشغيل في الخلفية. يوضّح سبب ذلك القسم القيود المفروضة على بدء الخدمات التي تعمل في المقدّمة وتحتاج إلى أذونات أثناء الاستخدام.

الاستثناءات من القيود المفروضة على بدء الخدمات عندما تكون التطبيقات قيد التشغيل في الخلفية

في الحالات التالية، يمكن لتطبيقك بدء الخدمات التي تعمل في المقدّمة حتى أثناء تشغيل تطبيقك في الخلفية:

القيود المفروضة على بدء الخدمات التي تعمل في المقدّمة والتي تحتاج إلى أذونات أثناء الاستخدام

في الإصدار 14 من نظام التشغيل Android (المستوى 34 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، هناك حالات خاصة يجب الانتباه إليها إذا كنت بصدد بدء خدمة تعمل في المقدّمة وتحتاج إلى أذونات أثناء الاستخدام.

إذا كان تطبيقك يستهدف الإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث، يتحقّق نظام التشغيل عند إنشاء خدمة تعمل في المقدّمة للتأكّد من أنّ تطبيقك لديه كل الأذونات المناسبة لنوع الخدمة هذا. على سبيل المثال، عند إنشاء خدمة تعمل في المقدّمة من النوع الميكروفون، يتحقق نظام التشغيل من أنّ تطبيقك يمتلك حاليًا الإذن RECORD_AUDIO. إذا لم يكن لديك هذا الإذن، سيُرسِل النظام خطأ SecurityException.

بالنسبة إلى الأذونات التي يتم استخدامها أثناء التشغيل، قد يؤدي ذلك إلى حدوث مشكلة محتملة. إذا كان تطبيقك يمتلك إذنًا أثناء الاستخدام، لن يحصل على هذا الإذن إلا أثناء كونه في المقدّمة. وهذا يعني أنّه إذا كان تطبيقك قيد التشغيل في الخلفية وحاول إنشاء خدمة تعمل في المقدّمة من النوع "الكاميرا" أو "الموقع الجغرافي" أو "الميكروفون"، سيلاحظ النظام أنّ تطبيقك لا يملك حاليًا الأذونات المطلوبة، وسيُرسِل SecurityException.

وبالمثل، إذا كان تطبيقك يعمل في الخلفية وأنشأ خدمة صحة تحتاج إلى إذن BODY_SENSORS، لن يكون لدى التطبيق هذا الإذن في الوقت الحالي، وسيُصدر النظام استثناءً. (لا ينطبق ذلك إذا كانت الخدمة صحية وتحتاج إلى أذونات مختلفة، مثل ACTIVITY_RECOGNITION.) لا يؤدي الاتصال برقم PermissionChecker.checkSelfPermission() إلى منع حدوث هذه المشكلة. إذا كان تطبيقك يمتلك إذنًا أثناء الاستخدام، ويشغّل checkSelfPermission() للتحقّق مما إذا كان يمتلك هذا الإذن، ستُعرِض الوسيلةPERMISSION_GRANTED حتى إذا كان التطبيق في الخلفية. عندما تعرض المحاولةPERMISSION_GRANTED، يعني ذلك أنّ تطبيقك لديه هذا الإذن أثناء استخدام التطبيق.

لهذا السبب، إذا كانت الخدمة التي تعمل في المقدّمة تحتاج إلى إذن أثناء الاستخدام، يجب استدعاء Context.startForegroundService() أو Context.bindService() عندما يكون لتطبيقك نشاط مرئي، ما لم تندرج الخدمة ضمن أحد الإعفاءات المحدّدة.

حالات الإعفاء من القيود المفروضة على الأذونات التي يتم استخدامها أثناء تشغيل التطبيق

في بعض الحالات، حتى إذا تم تشغيل خدمة تعمل في المقدّمة أثناء تشغيل التطبيق في الخلفية، سيظل بإمكانها الوصول إلى معلومات الموقع الجغرافي والكاميرا والميكروفون أثناء تشغيل التطبيق في المقدّمة ("أثناء الاستخدام").

في هذه الحالات نفسها، إذا أعلنت الخدمة عن نوع الخدمة التي تعمل في المقدّمة location وبدأتها من خلال تطبيق لديه إذن ACCESS_BACKGROUND_LOCATION ، يمكن لهذه الخدمة الوصول إلى معلومات الموقع الجغرافي في كل الأوقات، حتى عندما يعمل التطبيق في الخلفية.

تتضمّن القائمة التالية هذه الحالات:

  • يبدأ أحد مكوّنات النظام الخدمة.
  • تبدأ الخدمة بالتفاعل مع تطبيقات أداة مصغّرة.
  • تبدأ الخدمة بالتفاعل مع إشعار.
  • تبدأ الخدمة كمحاولة تسجيل PendingIntent يتم إرسالها من تطبيق مختلف مرئي.
  • تبدأ الخدمة من خلال تطبيق لوحدة التحكّم بسياسة الجهاز الذي يعمل في وضع مالك الجهاز.
  • تبدأ الخدمة من خلال تطبيق يقدّم VoiceInteractionService.
  • يبدأ تشغيل الخدمة من خلال تطبيق يمتلك الإذن المميّز START_ACTIVITIES_FROM_BACKGROUND.

تحديد الخدمات المتأثرة في تطبيقك

عند اختبار تطبيقك، ابدأ خدماته التي تعمل في المقدّمة. إذا كانت الخدمة التي تم تشغيلها قد محدودة الوصول إلى الموقع الجغرافي والميكروفون والكاميرا، تظهر الرسالة التالية في Logcat:

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME