لا يمكن للتطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث تشغيل الخدمات التي تعمل في المقدّمة أثناء تشغيل التطبيق في الخلفية، باستثناء بعض الحالات الخاصة. إذا حاول أحد التطبيقات بدء خدمة تعمل في المقدّمة وكان التطبيق قيد التشغيل في الخلفية ولم يتم استيفاء متطلبات إحدى الحالات الاستثنائية، يعرض النظام الخطأ ForegroundServiceStartNotAllowedException.
بالإضافة إلى ذلك، إذا أراد أحد التطبيقات تشغيل خدمة تعمل في المقدّمة وتحتاج إلى أذونات أثناء الاستخدام (مثل أذونات أداة استشعار الجسم أو الكاميرا أو الميكروفون أو الموقع الجغرافي)، لا يمكنه إنشاء الخدمة عندما يكون التطبيق قيد التشغيل في الخلفية، حتى إذا كان التطبيق يندرج ضمن أحد الاستثناءات من قيود بدء التشغيل في الخلفية. ويتم توضيح سبب ذلك في قسم القيود المفروضة على بدء الخدمات التي تعمل في المقدّمة والتي تتطلّب أذونات "أثناء الاستخدام".
الإعفاءات من القيود المفروضة على بدء الخدمات عندما تكون التطبيقات قيد التشغيل في الخلفية
في الحالات التالية، يمكن لتطبيقك بدء الخدمات التي تعمل في المقدّمة حتى أثناء تشغيل تطبيقك في الخلفية:
- ينتقل تطبيقك من حالة مرئية للمستخدم، مثل نشاط.
- يمكن لتطبيقك بدء نشاط من الخلفية، باستثناء الحالة التي يتضمّن فيها التطبيق نشاطًا في الأنشطة السابقة لمهمة حالية.
يتلقّى تطبيقك رسالة ذات أولوية قصوى باستخدام مراسلة Firebase السحابية.
ينفّذ المستخدم إجراءً على عنصر في واجهة المستخدم مرتبط بتطبيقك، مثل التفاعل مع فقاعة أو إشعار أو تطبيق مصغّر أو نشاط.
يستدعي تطبيقك منبّهًا دقيقًا لإكمال إجراء يطلبه المستخدم.
أن يكون تطبيقك هو طريقة الإدخال الحالية على الجهاز
يتلقّى تطبيقك حدثًا مرتبطًا بالحدود الجغرافية أو الانتقال إلى التعرّف على النشاط.
بعد إعادة تشغيل الجهاز وتلقّي إجراء intent
ACTION_BOOT_COMPLETEDأوACTION_LOCKED_BOOT_COMPLETEDأوACTION_MY_PACKAGE_REPLACEDفي مستقبل البث.يتلقّى تطبيقك إجراءات الأهداف
ACTION_TIMEZONE_CHANGEDأوACTION_TIME_CHANGEDأوACTION_LOCALE_CHANGEDفي جهاز استقبال البث.يتلقّى تطبيقك الحدث
ACTION_TRANSACTION_DETECTEDمنNfcService.التطبيقات التي لها أدوار أو أذونات معيّنة في النظام، مثل مالكي الأجهزة ومالكي الملفات الشخصية
يستخدم تطبيقك أداة إدارة الأجهزة المصاحبة ويشير إلى استخدام إذن
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDأو إذنREQUEST_COMPANION_RUN_IN_BACKGROUND. استخدِمREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDكلما أمكن.إذا أوقف المستخدم ميزة "تحسينات البطارية" لتطبيقك.
يملك تطبيقك إذن
SYSTEM_ALERT_WINDOW. ملاحظة: إذا كان تطبيقك يستهدف الإصدار 15 من نظام التشغيل Android أو الإصدارات الأحدث، يجب أن يحصل على إذنSYSTEM_ALERT_WINDOWويجب أن يتضمّن التطبيق حاليًا نافذة تراكُب مرئية.
القيود المفروضة على بدء الخدمات التي تعمل في المقدّمة وتتطلّب أذونات "أثناء الاستخدام"
في الإصدار 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