اگر برنامهای اندروید 15 یا بالاتر را هدف قرار دهد، سیستم محدودیتهایی برای مدت زمانی که برخی از سرویسهای پیشزمینه مجاز به اجرا هستند در حالی که برنامه شما در پسزمینه است، اعمال میکند. در حال حاضر، این محدودیت فقط برای سرویس های پیش زمینه نوع سرویس پیش زمینه dataSync
و mediaProcessing
اعمال می شود. محدودیت های محدودتری در مورد نوع سرویس پیش زمینه shortService
وجود دارد که در مستندات آن نوع سرویس مورد بحث قرار گرفته است.
رفتار تایم اوت
این سیستم به سرویسهای پیشزمینه dataSync
و mediaProcessing
اجازه میدهد در مجموع 6 ساعت در یک دوره 24 ساعته اجرا شوند، پس از آن سیستم سرویس سرویس در حال اجرا را متد Service.onTimeout(int, int)
(معرفی شده در اندروید 15) فراخوانی میکند. (نوع سرویس پیش زمینه mediaProcessing
در اندروید 15 اضافه شد.) محدودیت زمانی شش ساعته به طور جداگانه برای dataSync
و خدمات mediaProcessing
پیگیری می شود. به عنوان مثال، اگر یک سرویس dataSync
فقط یک ساعت کار کند، برنامه فقط پنج ساعت برای خدمات پیش زمینه mediaProcessing
در دسترس خواهد بود، اما برای خدمات dataSync
شش ساعت کامل در دسترس خواهد بود.
هنگامی که یک سرویس پیش زمینه به محدودیت شش ساعته می رسد، سرویس چند ثانیه فرصت دارد تا Service.stopSelf()
را فراخوانی کند. هنگامی که سیستم Service.onTimeout()
فراخوانی می کند، سرویس دیگر به عنوان سرویس پیش زمینه در نظر گرفته نمی شود. اگر سرویس Service.stopSelf()
را فراخوانی نکند، سیستم یک استثنا داخلی ایجاد می کند. استثنا با پیام زیر در Logcat وارد شده است:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
برای جلوگیری از مشکلات ناشی از این تغییر رفتار، می توانید یک یا چند مورد از موارد زیر را انجام دهید:
- از سرویس خود بخواهید روش جدید
Service.onTimeout(int, int)
را پیاده سازی کند. هنگامی که برنامه شما پاسخ تماس را دریافت کرد، مطمئن شوید که در عرض چند ثانیهstopSelf()
تماس بگیرید. (اگر برنامه را فوراً متوقف نکنید، سیستم یک خرابی ایجاد می کند.) - مطمئن شوید که سرویسهای
dataSync
وmediaProcessing
برنامه شما در هر دوره ۲۴ ساعته در مجموع بیش از ۶ ساعت اجرا نمیشوند (مگر اینکه کاربر با برنامه تعامل داشته باشد و تایمر را بازنشانی کند). - سرویسهای پیشزمینه
dataSync
یاmediaProcessing
را فقط در نتیجه تعامل مستقیم کاربر شروع کنید. از آنجایی که هنگام شروع سرویس، برنامه شما در پیش زمینه است، سرویس شما شش ساعت کامل پس از رفتن برنامه به پسزمینه است. - به جای استفاده از این خدمات پیش زمینه، از یک API جایگزین استفاده کنید، مانند WorkManager. به طور خاص، به جای استفاده از سرویس پیش زمینه
dataSync
، از یک API جایگزین استفاده کنید.
اگر سرویسهای پیشزمینه dataSync
برنامه شما در 24 ساعت گذشته به مدت 6 ساعت اجرا شده است، نمیتوانید سرویس پیشزمینه dataSync
دیگری را راهاندازی کنید مگر اینکه کاربر برنامه شما را به پیشزمینه آورده باشد (که تایمر را بازنشانی میکند). اگر میخواهید سرویس پیشزمینه dataSync
دیگری را راهاندازی کنید، سیستم ForegroundServiceStartNotAllowedException
را با پیام خطایی مانند «محدودیت زمانی برای نوع سرویس پیشزمینه dataSync تمام شده است» پرتاب میکند.
تست کردن
برای آزمایش رفتار برنامهتان، میتوانید وقفههای همگامسازی دادهها را فعال کنید، حتی اگر برنامه شما Android 15 را هدف قرار ندهد (تا زمانی که برنامه روی دستگاه Android 15 اجرا شود). برای فعال کردن بازه زمانی، دستور adb
زیر را اجرا کنید:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
همچنین میتوانید مدت زمان وقفه را تنظیم کنید تا آزمایش نحوه عملکرد برنامهتان در زمان رسیدن به محدودیت آسانتر شود. برای تنظیم یک بازه زمانی جدید برای سرویس های پیش زمینه dataSync
، دستور adb
زیر را اجرا کنید:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
برای تنظیم یک بازه زمانی جدید برای خدمات پیش زمینه mediaProcessing
، این دستور را اجرا کنید:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds