برنامههایی که Android 12 (سطح API 31) یا بالاتر را هدف قرار میدهند، نمیتوانند خدمات پیشزمینه را در حالی که برنامه در پسزمینه اجرا میشود، راهاندازی کنند، به جز چند مورد خاص . اگر برنامه ای سعی کند یک سرویس پیش زمینه را در حالی که برنامه در پس زمینه اجرا می شود راه اندازی کند و سرویس پیش زمینه یکی از موارد استثنایی را برآورده نکند، سیستم یک ForegroundServiceStartNotAllowedException
را پرتاب می کند.
بهعلاوه، اگر برنامهای بخواهد سرویس پیشزمینهای را راهاندازی کند که به مجوزهای حین استفاده نیاز دارد (مثلاً مجوزهای حسگر بدن، دوربین، میکروفون یا موقعیت مکانی)، نمیتواند در حالی که برنامه در پسزمینه است، سرویس را ایجاد کند ، حتی اگر برنامه در یکی از معافیتهای محدودیتهای شروع پسزمینه قرار گیرد. دلیل این امر در بخش محدودیتهای شروع سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند توضیح داده شده است.
معافیت از محدودیت های شروع پس زمینه
در شرایط زیر، برنامه شما میتواند خدمات پیشزمینه را حتی زمانی که برنامه شما در پسزمینه اجرا میشود راهاندازی کند:
- برنامه شما از حالتی که کاربر قابل مشاهده است، مانند یک فعالیت، انتقال مییابد.
- برنامه شما میتواند یک فعالیت را از پسزمینه شروع کند ، به جز مواردی که برنامه دارای یک فعالیت در پشته یک کار موجود است.
برنامه شما با استفاده از Firebase Cloud Messaging پیامی با اولویت بالا دریافت میکند.
کاربر اقدامی را روی یک عنصر UI مربوط به برنامه شما انجام می دهد. برای مثال، ممکن است با یک حباب ، اعلان ، ویجت یا فعالیت تعامل داشته باشند.
برنامه شما یک زنگ دقیق را برای تکمیل عملی که کاربر درخواست می کند فرا می خواند.
برنامه شما روش ورودی فعلی دستگاه است.
برنامه شما رویدادی را دریافت میکند که مربوط به geofencing یا انتقال شناسایی فعالیت است.
پس از راهاندازی مجدد دستگاه و دریافت کنش هدف
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
است. توجه: اگر برنامه شما Android 15 یا بالاتر را هدف قرار می دهد، باید مجوزSYSTEM_ALERT_WINDOW
را داشته باشد و برنامه در حال حاضر باید دارای یک پنجره همپوشانی قابل مشاهده باشد.
محدودیتهایی در راهاندازی سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند
در Android 14 (سطح API 34) یا بالاتر، اگر در حال راهاندازی یک سرویس پیشزمینه هستید که به مجوزهای حین استفاده نیاز دارد، شرایط خاصی وجود دارد که باید از آنها آگاه باشید.
اگر برنامه شما اندروید 14 یا بالاتر را هدف قرار میدهد، سیستم عامل زمانی که یک سرویس پیشزمینه ایجاد میکنید، بررسی میکند تا مطمئن شود برنامه شما همه مجوزهای مناسب برای آن نوع سرویس را دارد. به عنوان مثال، هنگامی که یک سرویس پیش زمینه از نوع میکروفون ایجاد می کنید، سیستم عامل تأیید می کند که برنامه شما در حال حاضر مجوز RECORD_AUDIO
را دارد. اگر آن مجوز را نداشته باشید، سیستم یک SecurityException
می اندازد.
برای مجوزهای حین استفاده، این باعث یک مشکل بالقوه می شود. اگر برنامه شما دارای مجوز حین استفاده است، تنها زمانی که در پیش زمینه است این مجوز را دارد. این بدان معناست که اگر برنامه شما در پسزمینه است و سعی میکند یک سرویس پیشزمینه از نوع دوربین، مکان یا میکروفون ایجاد کند، سیستم میبیند که برنامه شما در حال حاضر مجوزهای لازم را ندارد و یک SecurityException
میزند.
به طور مشابه، اگر برنامه شما در پسزمینه باشد و یک سرویس بهداشتی ایجاد کند که به مجوز BODY_SENSORS
نیاز دارد، برنامه در حال حاضر این مجوز را ندارد و سیستم یک استثنا ایجاد میکند. (اگر این یک سرویس بهداشتی باشد که به مجوزهای مختلفی نیاز دارد، مانند ACTIVITY_RECOGNITION
این مورد اعمال نمی شود.) فراخوانی PermissionChecker.checkSelfPermission()
از این مشکل جلوگیری نمی کند. اگر برنامه شما مجوز while-in-use داشته باشد، و 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
برنامههایی که Android 12 (سطح API 31) یا بالاتر را هدف قرار میدهند، نمیتوانند خدمات پیشزمینه را در حالی که برنامه در پسزمینه اجرا میشود، راهاندازی کنند، به جز چند مورد خاص . اگر برنامه ای سعی کند یک سرویس پیش زمینه را در حالی که برنامه در پس زمینه اجرا می شود راه اندازی کند و سرویس پیش زمینه یکی از موارد استثنایی را برآورده نکند، سیستم یک ForegroundServiceStartNotAllowedException
را پرتاب می کند.
بهعلاوه، اگر برنامهای بخواهد سرویس پیشزمینهای را راهاندازی کند که به مجوزهای حین استفاده نیاز دارد (مثلاً مجوزهای حسگر بدن، دوربین، میکروفون یا موقعیت مکانی)، نمیتواند در حالی که برنامه در پسزمینه است، سرویس را ایجاد کند ، حتی اگر برنامه در یکی از معافیتهای محدودیتهای شروع پسزمینه قرار گیرد. دلیل این امر در بخش محدودیتهای شروع سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند توضیح داده شده است.
معافیت از محدودیت های شروع پس زمینه
در شرایط زیر، برنامه شما میتواند خدمات پیشزمینه را حتی زمانی که برنامه شما در پسزمینه اجرا میشود راهاندازی کند:
- برنامه شما از حالتی که کاربر قابل مشاهده است، مانند یک فعالیت، انتقال مییابد.
- برنامه شما میتواند یک فعالیت را از پسزمینه شروع کند ، به جز مواردی که برنامه دارای یک فعالیت در پشته یک کار موجود است.
برنامه شما با استفاده از Firebase Cloud Messaging پیامی با اولویت بالا دریافت میکند.
کاربر اقدامی را روی یک عنصر UI مربوط به برنامه شما انجام می دهد. برای مثال، ممکن است با یک حباب ، اعلان ، ویجت یا فعالیت تعامل داشته باشند.
برنامه شما یک زنگ دقیق را برای تکمیل عملی که کاربر درخواست می کند فرا می خواند.
برنامه شما روش ورودی فعلی دستگاه است.
برنامه شما رویدادی را دریافت میکند که مربوط به geofencing یا انتقال شناسایی فعالیت است.
پس از راهاندازی مجدد دستگاه و دریافت کنش هدف
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
است. توجه: اگر برنامه شما Android 15 یا بالاتر را هدف قرار می دهد، باید مجوزSYSTEM_ALERT_WINDOW
را داشته باشد و برنامه در حال حاضر باید دارای یک پنجره همپوشانی قابل مشاهده باشد.
محدودیتهایی در راهاندازی سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند
در Android 14 (سطح API 34) یا بالاتر، اگر در حال راهاندازی یک سرویس پیشزمینه هستید که به مجوزهای حین استفاده نیاز دارد، شرایط خاصی وجود دارد که باید از آنها آگاه باشید.
اگر برنامه شما اندروید 14 یا بالاتر را هدف قرار میدهد، سیستم عامل زمانی که یک سرویس پیشزمینه ایجاد میکنید، بررسی میکند تا مطمئن شود برنامه شما همه مجوزهای مناسب برای آن نوع سرویس را دارد. به عنوان مثال، هنگامی که یک سرویس پیش زمینه از نوع میکروفون ایجاد می کنید، سیستم عامل تأیید می کند که برنامه شما در حال حاضر مجوز RECORD_AUDIO
را دارد. اگر آن مجوز را نداشته باشید، سیستم یک SecurityException
می اندازد.
برای مجوزهای حین استفاده، این باعث یک مشکل بالقوه می شود. اگر برنامه شما دارای مجوز حین استفاده است، تنها زمانی که در پیش زمینه است این مجوز را دارد. این بدان معناست که اگر برنامه شما در پسزمینه است و سعی میکند یک سرویس پیشزمینه از نوع دوربین، مکان یا میکروفون ایجاد کند، سیستم میبیند که برنامه شما در حال حاضر مجوزهای لازم را ندارد و یک SecurityException
میزند.
به طور مشابه، اگر برنامه شما در پسزمینه باشد و یک سرویس بهداشتی ایجاد کند که به مجوز BODY_SENSORS
نیاز دارد، برنامه در حال حاضر این مجوز را ندارد و سیستم یک استثنا ایجاد میکند. (اگر این یک سرویس بهداشتی باشد که به مجوزهای مختلفی نیاز دارد، مانند ACTIVITY_RECOGNITION
این مورد اعمال نمی شود.) فراخوانی PermissionChecker.checkSelfPermission()
از این مشکل جلوگیری نمی کند. اگر برنامه شما مجوز while-in-use داشته باشد، و 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