لا يمكن للتطبيقات التي تستهدف الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث بدء الخدمات التي تعمل في المقدّمة أثناء تشغيل التطبيق في الخلفية، باستثناء بعض الحالات الخاصة. إذا حاول أحد التطبيقات بدء خدمة تعمل في المقدّمة أثناء تشغيله في الخلفية، ولم تستوفِ الخدمة التي تعمل في المقدّمة إحدى الحالات الاستثنائية، سيُطلق النظام ForegroundServiceStartNotAllowedException
.
بالإضافة إلى ذلك، إذا أراد تطبيق تشغيل خدمة تعمل في المقدّمة وتتطلّب أذونات أثناء الاستخدام (مثل أذونات الوصول إلى أجهزة استشعار الجسم أو الكاميرا أو الميكروفون أو الموقع الجغرافي)، لا يمكنه إنشاء الخدمة أثناء تشغيل التطبيق في الخلفية، حتى إذا كان التطبيق يندرج ضمن أحد الاستثناءات من قيود التشغيل في الخلفية. يتم توضيح سبب ذلك في القسم قيود على بدء الخدمات التي تعمل في المقدّمة والتي تتطلّب أذونات "أثناء الاستخدام فقط".
الاستثناءات من القيود المفروضة على بدء الخدمات عندما تكون التطبيقات قيد التشغيل في الخلفية
في الحالات التالية، يمكن لتطبيقك بدء الخدمات التي تعمل في المقدّمة حتى عندما يكون تطبيقك قيد التشغيل في الخلفية:
- ينتقل تطبيقك من حالة مرئية للمستخدم، مثل نشاط.
- يمكن لتطبيقك بدء نشاط من الخلفية، باستثناء الحالة التي يتضمّن فيها التطبيق نشاطًا في حزمة الخلفية لمهمة حالية.
يتلقّى تطبيقك رسالة ذات أولوية عالية باستخدام المراسلة عبر السحابة الإلكترونية من Firebase.
ينفّذ المستخدم إجراءً على أحد عناصر واجهة المستخدم المرتبطة بتطبيقك، مثل التفاعل مع فقاعة أو إشعار أو أداة أو نشاط.
يستدعي تطبيقك منبّهًا محدّد الوقت لإكمال إجراء يطلبه المستخدم.
تطبيقك هو طريقة الإدخالالحالية على الجهاز.
يتلقّى تطبيقك حدثًا ذا صلة بالسياج الجغرافي أو بالانتقال إلى التعرّف على النشاط.
بعد إعادة تشغيل الجهاز وتلقّي إجراء النية
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
ويجب أن يعرض التطبيق حاليًا نافذة تراكب مرئية.
قيود على بدء الخدمات التي تعمل في المقدّمة والتي تتطلّب أذونات "أثناء الاستخدام"
في نظام التشغيل Android 14 (المستوى 34 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، هناك حالات خاصة يجب الانتباه إليها إذا كنت بصدد بدء خدمة تعمل في المقدّمة وتتطلّب أذونات "أثناء الاستخدام".
إذا كان تطبيقك يستهدف الإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث، يتحقّق نظام التشغيل عند إنشاء خدمة تعمل في المقدّمة للتأكّد من أنّ تطبيقك لديه جميع الأذونات المناسبة لنوع الخدمة هذا. على سبيل المثال، عند إنشاء خدمة تعمل في المقدّمة من النوع microphone، يتحقّق نظام التشغيل من أنّ تطبيقك لديه حاليًا إذن 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