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