برای کمک به توسعهدهندگان در تعریف سرویسهای پیشزمینه کاربر، اندروید 10 ویژگی android:foregroundServiceType در عنصر <service> معرفی کرد.
اگر برنامه شما اندروید 14 را هدف قرار می دهد، باید انواع خدمات پیش زمینه مناسب را مشخص کند. مانند نسخه های قبلی اندروید، چندین نوع را می توان با هم ترکیب کرد. این لیست انواع خدمات پیش زمینه را برای انتخاب نشان می دهد:
-
camera -
connectedDevice -
dataSync -
health -
location -
mediaPlayback -
mediaProjection -
microphone -
phoneCall -
remoteMessaging -
shortService -
specialUse -
systemExempted
اگر مورد استفاده در برنامه شما با هیچ یک از این انواع مرتبط نیست، اکیداً توصیه میکنیم که منطق خود را برای استفاده از WorkManager یا کارهای انتقال داده توسط کاربر تغییر دهید.
انواع health, remoteMessaging, shortService, specialUse و systemExempted در اندروید 14 جدید هستند.
قطعه کد زیر نمونه ای از اعلان نوع سرویس پیش زمینه را در مانیفست ارائه می دهد:
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
اگر برنامهای که اندروید 14 را هدف قرار میدهد، انواعی را برای یک سرویس معین در مانیفست تعریف نمیکند، سیستم با فراخوانی startForeground() برای آن سرویس MissingForegroundServiceTypeException را افزایش میدهد.
مجوز جدید برای استفاده از انواع خدمات پیش زمینه را اعلام کنید
اگر برنامه هایی که اندروید 14 را هدف قرار می دهند از سرویس پیش زمینه استفاده می کنند، باید مجوز خاصی را بر اساس نوع سرویس پیش زمینه ای که اندروید 14 معرفی می کند، اعلام کنند. این مجوزها در بخشهایی با عنوان "مجوز که باید در فایل مانیفست خود اعلام کنید" در موارد استفاده مورد نظر و اجرای هر بخش نوع خدمات پیشزمینه در این صفحه ظاهر میشوند.
همه مجوزها به عنوان مجوزهای عادی تعریف شده اند و به طور پیش فرض اعطا می شوند. کاربران نمی توانند این مجوزها را لغو کنند.
نوع سرویس پیش زمینه را در زمان اجرا درج کنید
بهترین روش برای برنامه هایی که خدمات پیش زمینه را شروع می کنند، استفاده از نسخه ServiceCompat startForeground() (موجود در androidx-core 1.12 و بالاتر) است که در آن یک عدد صحیح بیتی از انواع سرویس های پیش زمینه ارسال می کنید. شما می توانید انتخاب کنید که یک یا چند مقدار نوع ارسال کنید.
معمولاً باید فقط انواع مورد نیاز برای یک مورد خاص را اعلام کنید. این امر برآوردن انتظارات سیستم را برای هر نوع خدمات پیش زمینه آسان تر می کند. در مواردی که یک سرویس پیش زمینه با چندین نوع شروع می شود، آنگاه سرویس پیش زمینه باید به الزامات اجرای پلت فرم در همه انواع پایبند باشد.
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
اگر نوع سرویس پیش زمینه در تماس مشخص نشده باشد، نوع به طور پیش فرض مقادیر تعریف شده در مانیفست را تعیین می کند. اگر نوع سرویس را در مانیفست مشخص نکردهاید، سیستم MissingForegroundServiceTypeException را پرتاب میکند.
اگر سرویس پیشزمینه پس از راهاندازی به مجوزهای جدید نیاز دارد، باید دوباره startForeground() فراخوانی کنید و انواع سرویسهای جدید را اضافه کنید. به عنوان مثال، فرض کنید یک برنامه تناسب اندام یک سرویس ردیاب در حال اجرا را اجرا می کند که همیشه به اطلاعات location نیاز دارد، اما ممکن است به مجوزهای media نیاز داشته باشد یا نباشد. باید هم location و هم mediaPlayback را در مانیفست اعلام کنید. اگر کاربر اجرا را شروع کند و فقط میخواهد موقعیت مکانی او ردیابی شود، برنامه شما باید startForeground() را فراخوانی کند و فقط نوع سرویس location را ارسال کند. سپس، اگر کاربر میخواهد پخش صدا را شروع کند، دوباره startForeground() را فراخوانی کنید و location|mediaPlayback را ارسال کنید.
بررسی زمان اجرای سیستم
سیستم استفاده مناسب از انواع سرویس های پیش زمینه را بررسی می کند و تأیید می کند که برنامه مجوزهای زمان اجرا مناسب را درخواست کرده است یا از API های مورد نیاز استفاده می کند. برای مثال، سیستم انتظار دارد برنامههایی که از نوع سرویس پیشزمینه FOREGROUND_SERVICE_TYPE_LOCATION استفاده میکنند، ACCESS_COARSE_LOCATION یا ACCESS_FINE_LOCATION درخواست کنند.
این بدان معناست که برنامهها هنگام درخواست مجوز از کاربر و شروع خدمات پیشزمینه، باید از ترتیب بسیار خاصی از عملیات پیروی کنند. قبل از اینکه برنامه برای فراخوانی startForeground() اقدام کند، باید مجوزها درخواست و اعطا شود. برنامههایی که پس از راهاندازی سرویس پیشزمینه، مجوزهای مناسب را درخواست میکنند، باید این ترتیب عملیات را تغییر دهند و قبل از شروع سرویس پیشزمینه مجوز درخواست کنند.
مشخصات اجرای پلت فرم در بخش هایی با عنوان "نیازهای زمان اجرا" در موارد استفاده مورد نظر و اجرای هر بخش نوع خدمات پیش زمینه در این صفحه ظاهر می شود.
موارد استفاده در نظر گرفته شده و اجرا برای هر نوع خدمات پیش زمینه
برای استفاده از یک نوع سرویس پیش زمینه معین، باید مجوز خاصی را در فایل مانیفست خود اعلام کنید، باید الزامات زمان اجرا خاصی را برآورده کنید، و برنامه شما باید یکی از مجموعه موارد استفاده در نظر گرفته شده برای آن نوع را برآورده کند. بخشهای زیر مجوزی که باید اعلام کنید، پیشنیازهای زمان اجرا و موارد استفاده مورد نظر برای هر نوع را توضیح میدهد.
دوربین
- نوع سرویس پیش زمینه برای اعلام در مانیفست تحت
android:foregroundServiceType -
camera - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_CAMERA - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_CAMERA - پیش نیازهای زمان اجرا
مجوز زمان اجرا
CAMERAرا درخواست کنید و به آنها اعطا شودتوجه: مجوز زمان اجرا
CAMERAمشمول محدودیتهای حین استفاده است. به همین دلیل، به استثنای چند مورد ، نمیتوانید در حالی که برنامه شما در پسزمینه است، یک سرویس پیشزمینهcameraایجاد کنید. برای اطلاعات بیشتر، به محدودیتهای راهاندازی سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند مراجعه کنید.- توضیحات
به دسترسی به دوربین از پسزمینه ادامه دهید، مانند برنامههای چت ویدیویی که امکان انجام چند کار را فراهم میکنند.
دستگاه متصل
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
connectedDevice - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_CONNECTED_DEVICE - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE - پیش نیازهای زمان اجرا
حداقل یکی از شرایط زیر باید درست باشد:
حداقل یکی از مجوزهای زیر را در مانیفست خود اعلام کنید:
حداقل یکی از مجوزهای زمان اجرا زیر را درخواست کنید و به آنها اعطا شود:
با
UsbManager.requestPermission()تماس بگیرید
- توضیحات
تعامل با دستگاه های خارجی که به بلوتوث، NFC، IR، USB یا اتصال شبکه نیاز دارند.
- جایگزین ها
اگر برنامه شما نیاز به انتقال مداوم داده به یک دستگاه خارجی دارد، به جای آن از مدیر دستگاه همراه استفاده کنید. از API حضور دستگاه همراه استفاده کنید تا به برنامه شما کمک کند تا زمانی که دستگاه همراه در محدوده است در حال اجرا بماند.
اگر برنامه شما نیاز به اسکن دستگاههای بلوتوث دارد، به جای آن از API اسکن بلوتوث استفاده کنید.
همگام سازی داده ها
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
dataSync - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_DATA_SYNC - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_DATA_SYNC - پیش نیازهای زمان اجرا
- هیچ کدام
- توضیحات
عملیات انتقال داده مانند موارد زیر:
- داده ها را بارگذاری یا دانلود کنید
- عملیات پشتیبان گیری و بازیابی
- عملیات واردات یا صادرات
- واکشی داده ها
- پردازش فایل های محلی
- انتقال داده ها بین دستگاه و ابر از طریق شبکه
- جایگزین ها
برای اطلاعات دقیق به گزینه های جایگزین برای سرویس های پیش زمینه همگام سازی داده ها مراجعه کنید.
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
dataSync - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_DATA_SYNC - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_DATA_SYNC - پیش نیازهای زمان اجرا
- هیچ کدام
- توضیحات
عملیات انتقال داده، مانند موارد زیر:
- داده ها را بارگذاری یا دانلود کنید
- عملیات پشتیبان گیری و بازیابی
- عملیات واردات یا صادرات
- واکشی داده ها
- پردازش فایل های محلی
- انتقال داده ها بین دستگاه و ابر از طریق شبکه
- جایگزین ها
برای اطلاعات دقیق به گزینه های جایگزین برای سرویس های پیش زمینه همگام سازی داده ها مراجعه کنید.
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
dataSync - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_DATA_SYNC - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_DATA_SYNC - پیش نیازهای زمان اجرا
- هیچ کدام
- توضیحات
عملیات انتقال داده مانند موارد زیر:
- داده ها را بارگذاری یا دانلود کنید
- عملیات پشتیبان گیری و بازیابی
- عملیات واردات یا صادرات
- واکشی داده ها
- پردازش فایل های محلی
- انتقال داده ها بین دستگاه و ابر از طریق شبکه
- جایگزین ها
برای اطلاعات دقیق به گزینه های جایگزین برای سرویس های پیش زمینه همگام سازی داده ها مراجعه کنید.
سلامتی
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
health - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_HEALTH - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_HEALTH - پیش نیازهای زمان اجرا
حداقل یکی از شرایط زیر باید درست باشد:
مجوز
HIGH_SAMPLING_RATE_SENSORSدر مانیفست خود اعلام کنید.حداقل یکی از مجوزهای زمان اجرا زیر را درخواست کنید و به آنها اعطا شود:
-
BODY_SENSORSدر سطح API 35 و پایینتر -
READ_HEART_RATE -
READ_SKIN_TEMPERATURE -
READ_OXYGEN_SATURATION -
ACTIVITY_RECOGNITION
-
توجه: مجوزهای زمان اجرا
BODY_SENSORSو READ مبتنی بر حسگر مشمول محدودیتهای حین استفاده هستند. به همین دلیل، نمیتوانید سرویس پیشزمینهhealthایجاد کنید که از حسگرهای بدن در زمانی که برنامه شما در پسزمینه است استفاده کند، مگر اینکه مجوزهایBODY_SENSORS_BACKGROUND(سطح API 33 تا 35) یاREAD_HEALTH_DATA_IN_BACKGROUND(سطح API 36 و بالاتر) را دریافت کرده باشید. برای اطلاعات بیشتر، به محدودیتهای راهاندازی سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند مراجعه کنید.- توضیحات
هر گونه موارد استفاده طولانی مدت برای پشتیبانی از برنامه های دسته تناسب اندام مانند ردیاب های ورزشی.
مکان
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
location - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_LOCATION - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_LOCATION - پیش نیازهای زمان اجرا
کاربر باید خدمات موقعیت مکانی را فعال کرده باشد و به برنامه باید حداقل یکی از مجوزهای زمان اجرا زیر اعطا شود:
توجه: برای بررسی اینکه کاربر خدمات موقعیت مکانی را فعال کرده و همچنین به مجوزهای زمان اجرا اجازه دسترسی داده است، از
PermissionChecker#checkSelfPermission()استفاده کنید.توجه: مجوزهای زمان اجرا مکان مشمول محدودیتهای حین استفاده هستند. به همین دلیل، زمانی که برنامه شما در پسزمینه است، نمیتوانید یک سرویس پیشزمینه
locationایجاد کنید، مگر اینکه مجوز زمان اجراACCESS_BACKGROUND_LOCATIONرا دریافت کرده باشید. برای اطلاعات بیشتر، به محدودیتهای راهاندازی سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند مراجعه کنید.- توضیحات
موارد استفاده طولانی مدت که نیاز به دسترسی به موقعیت مکانی دارند، مانند ناوبری و اشتراک گذاری مکان.
- جایگزین ها
اگر برنامه شما باید زمانی که کاربر به مکان های خاصی می رسد فعال شود، به جای آن از geofence API استفاده کنید.
رسانه ها
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
mediaPlayback - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_MEDIA_PLAYBACK - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK - پیش نیازهای زمان اجرا
- هیچ کدام
- توضیحات
- پخش صدا یا ویدیو را از پسزمینه ادامه دهید. پشتیبانی از قابلیت ضبط ویدیوی دیجیتال (DVR) در Android TV .
- جایگزین ها
- اگر در حال نمایش ویدیوی تصویر در تصویر هستید، از حالت تصویر در تصویر استفاده کنید.
فرافکنی رسانه ای
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
mediaProjection - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_MEDIA_PROJECTION - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION - پیش نیازهای زمان اجرا
قبل از شروع سرویس پیش زمینه، متد
createScreenCaptureIntent()فراخوانی کنید. انجام این کار یک اعلان مجوز را به کاربر نشان می دهد. قبل از اینکه بتوانید سرویس را ایجاد کنید، کاربر باید مجوز را بدهد.پس از ایجاد سرویس پیش زمینه، می توانید
MediaProjectionManager.getMediaProjection()را فراخوانی کنید.- توضیحات
محتوای پروژه را با استفاده از API های
MediaProjectionبه نمایشگر غیر اصلی یا دستگاه خارجی ارسال کنید. این محتوا نباید منحصراً محتوای رسانه ای باشد.- جایگزین ها
برای پخش جریانی رسانه در دستگاه دیگری، از Google Cast SDK استفاده کنید.
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
mediaProjection - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_MEDIA_PROJECTION - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION - پیش نیازهای زمان اجرا
قبل از شروع سرویس پیش زمینه، متد
createScreenCaptureIntent()فراخوانی کنید. انجام این کار یک اعلان مجوز را به کاربر نشان می دهد. قبل از اینکه بتوانید سرویس را ایجاد کنید، کاربر باید مجوز را بدهد.پس از ایجاد سرویس پیش زمینه، می توانید
MediaProjectionManager.getMediaProjection()را فراخوانی کنید.- توضیحات
محتوای پروژه را با استفاده از API های
MediaProjectionبه نمایشگر غیر اصلی یا دستگاه خارجی ارسال کنید. این محتوا نباید منحصراً محتوای رسانه ای باشد.- جایگزین ها
برای پخش جریانی رسانه در دستگاه دیگری، از Google Cast SDK استفاده کنید.
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
mediaProjection - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_MEDIA_PROJECTION - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION - پیش نیازهای زمان اجرا
قبل از شروع سرویس پیش زمینه، متد
createScreenCaptureIntent()فراخوانی کنید. انجام این کار یک اعلان مجوز را به کاربر نشان می دهد. قبل از اینکه بتوانید سرویس را ایجاد کنید، کاربر باید مجوز را بدهد.پس از ایجاد سرویس پیش زمینه، می توانید
MediaProjectionManager.getMediaProjection()را فراخوانی کنید.- توضیحات
محتوای پروژه را با استفاده از API های
MediaProjectionبه نمایشگر غیر اصلی یا دستگاه خارجی ارسال کنید. این محتوا نباید منحصراً محتوای رسانه ای باشد.- جایگزین ها
برای پخش جریانی رسانه در دستگاه دیگری، از Google Cast SDK استفاده کنید.
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
mediaProjection - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_MEDIA_PROJECTION - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION - پیش نیازهای زمان اجرا
قبل از شروع سرویس پیش زمینه، متد
createScreenCaptureIntent()فراخوانی کنید. انجام این کار یک اعلان مجوز را به کاربر نشان می دهد. قبل از اینکه بتوانید سرویس را ایجاد کنید، کاربر باید مجوز را بدهد.پس از ایجاد سرویس پیش زمینه، می توانید
MediaProjectionManager.getMediaProjection()را فراخوانی کنید.- توضیحات
محتوای پروژه را با استفاده از API های
MediaProjectionبه نمایشگر غیر اصلی یا دستگاه خارجی ارسال کنید. این محتوا نباید منحصراً محتوای رسانه ای باشد.- جایگزین ها
برای پخش جریانی رسانه در دستگاه دیگری، از Google Cast SDK استفاده کنید.
میکروفون
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
microphone - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_MICROPHONE - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_MICROPHONE - پیش نیازهای زمان اجرا
مجوز زمان اجرا
RECORD_AUDIOرا درخواست کنید و به شما اعطا شود.توجه: مجوز زمان اجرا
RECORD_AUDIOمشمول محدودیتهای حین استفاده است. به همین دلیل، به استثنای چند مورد ، نمیتوانید در حالی که برنامه شما در پسزمینه است، یک سرویس پیشزمینهmicrophoneایجاد کنید. برای اطلاعات بیشتر، به محدودیتهای راهاندازی سرویسهای پیشزمینه که به مجوزهای حین استفاده نیاز دارند مراجعه کنید.- توضیحات
به ضبط میکروفون از پسزمینه، مانند ضبطکنندههای صدا یا برنامههای ارتباطی ادامه دهید.
تماس تلفنی
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
phoneCall - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_PHONE_CALL - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_PHONE_CALL - پیش نیازهای زمان اجرا
حداقل یکی از این شرایط باید درست باشد:
- برنامه مجوز
MANAGE_OWN_CALLSرا در فایل مانیفست خود اعلام کرده است.
- برنامه مجوز
- برنامه برنامه شمارهگیر پیشفرض از طریق نقش
ROLE_DIALERاست.
- برنامه برنامه شمارهگیر پیشفرض از طریق نقش
- توضیحات
با استفاده از رابط های برنامه کاربردی
ConnectionServiceبه تماس مداوم ادامه دهید.- جایگزین ها
اگر نیاز به برقراری تماس تلفنی، ویدیویی یا VoIP دارید، از کتابخانه
android.telecomاستفاده کنید.استفاده از
CallScreeningServiceرا برای نمایش تماس ها در نظر بگیرید.
پیام رسانی از راه دور
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
remoteMessaging - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_REMOTE_MESSAGING - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING - پیش نیازهای زمان اجرا
- هیچ کدام
- توضیحات
- پیام های متنی را از یک دستگاه به دستگاه دیگر منتقل کنید. به تداوم وظایف پیام رسانی کاربر هنگام تعویض دستگاه کمک می کند.
خدمات کوتاه
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypeshortService- 在清单中声明的权限
- 无
- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- 运行时前提条件
- 无
- 说明
快速完成不可中断或推迟的关键工作。
这种类型有一些独特的特征:
- 只能持续运行一小段时间(大约 3 分钟)。
- 不支持粘性前台服务。
- 无法启动其他前台服务。
- 不需要类型专用权限,不过它仍需要
FOREGROUND_SERVICE权限。 - 只有当应用当前符合启动新前台服务的条件时,
shortService才能更改为其他服务类型。 - 前台服务可以随时将其类型更改为
shortService,届时超时期限将开始。
shortService 的超时时间从调用
Service.startForeground()开始算起。应用应在发生超时之前调用Service.stopSelf()或Service.stopForeground()。否则,系统会调用新的Service.onTimeout(),让应用有机会调用stopSelf()或stopForeground()来停止其服务。调用
Service.onTimeout()后的短时间内,应用会进入缓存状态,并且不再被视为处于前台,除非用户正在主动与应用互动。应用缓存一小段时间后,服务还未停止,该应用会收到 ANR 消息。ANR 消息提及FOREGROUND_SERVICE_TYPE_SHORT_SERVICE。出于这些原因,实现Service.onTimeout()回调被视为一种最佳实践。Android 13 及更低版本中不存在
Service.onTimeout()回调。如果同一服务在此类设备上运行,则不会出现超时,也不会发生 ANR。确保您的服务在完成处理任务后立即停止,即使它尚未收到Service.onTimeout()回调也是如此。请务必注意,如果未遵循
shortService的超时设置,即使应用还有其他有效的前台服务或其他应用生命周期进程,应用也会遇到 ANR。如果应用对用户可见,或满足允许从后台启动前台服务的某一豁免条件,则使用
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE参数再次调用Service.StartForeground()会将超时时间再延长 3 分钟。如果应用对用户不可见且不满足其中一个豁免条件,则尝试启动其他前台服务(无论其类型如何)都会导致ForegroundServiceStartNotAllowedException。即使用户为您的应用停用电池优化功能,仍然会受到 shortService FGS 的影响。
如果您启动包含
shortService类型和另一个前台服务类型的前台服务,系统会忽略shortService类型声明。不过,该服务仍必须遵守其他声明类型的先决条件。如需了解详情,请参阅前台服务文档。
استفاده ویژه
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
specialUse - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_SPECIAL_USE - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_SPECIAL_USE - پیش نیازهای زمان اجرا
- هیچ کدام
- توضیحات
موارد استفاده معتبر از خدمات پیش زمینه را که تحت پوشش سایر انواع سرویس های پیش زمینه نیستند، پوشش می دهد.
علاوه بر اعلام نوع سرویس پیش زمینه
FOREGROUND_SERVICE_TYPE_SPECIAL_USE، توسعه دهندگان باید موارد استفاده را در مانیفست اعلام کنند. برای انجام این کار، آنها عنصر<property>را در عنصر<service>مشخص می کنند. وقتی برنامه خود را در کنسول Google Play ارسال می کنید، این مقادیر و موارد استفاده مربوطه بررسی می شوند. موارد استفاده ای که ارائه می کنید به صورت رایگان هستند و باید مطمئن شوید که اطلاعات کافی را ارائه می دهید تا به بازبین اجازه دهید ببیند چرا باید از نوعspecialUseاستفاده کنید.<service android:name="fooService" android:foregroundServiceType="specialUse"> <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="explanation_for_special_use"/> </service>
سیستم معاف شد
- نوع سرویس پیش زمینه برای اعلام در مانیفست در زیر
-
android:foregroundServiceType -
systemExempted - اجازه اعلام در مانیفست شما
-
FOREGROUND_SERVICE_SYSTEM_EXEMPTED - ثابت برای عبور به
startForeground() -
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED - پیش نیازهای زمان اجرا
- هیچ کدام
- توضیحات
برای برنامه های کاربردی سیستم و ادغام های سیستمی خاص، برای ادامه استفاده از خدمات پیش زمینه محفوظ است.
برای استفاده از این نوع، یک برنامه باید حداقل یکی از معیارهای زیر را داشته باشد:
- دستگاه در حالت نمایشی است
- برنامه مالک دستگاه است
- برنامه مالک پروفایل است
- برنامههای امنیتی که نقش
ROLE_EMERGENCYرا دارند - برنامه های مدیریت دستگاه
- برنامههایی که مجوز
SCHEDULE_EXACT_ALARMیاUSE_EXACT_ALARMرا در اختیار دارند و از سرویس پیشزمینه برای ادامه هشدارها در پسزمینه، از جمله هشدارهای فقط لمسی، استفاده میکنند. برنامه های VPN (پیکربندی شده با استفاده از تنظیمات > شبکه و اینترنت > VPN )
در غیر این صورت، اعلان این نوع باعث می شود که سیستم یک
ForegroundServiceTypeNotAllowedExceptionپرتاب کند.
اجرای خطمشی Google Play برای استفاده از انواع خدمات پیشزمینه
اگر برنامه شما Android 14 یا بالاتر را هدف قرار می دهد، باید انواع خدمات پیش زمینه برنامه خود را در صفحه محتوای برنامه کنسول Play ( خط مشی > محتوای برنامه ) اعلام کنید. برای اطلاعات بیشتر در مورد نحوه اعلام انواع سرویس های پیش زمینه خود در Play Console، به درک خدمات پیش زمینه و الزامات هدف تمام صفحه مراجعه کنید.