زمان‌بندی سرویس پیش‌زمینه‌ای

اگر برنامه‌ای Android 15 یا بالاتر را هدف قرار دهد، سیستم محدودیت‌هایی را بر مدت‌زمان مجاز برای اجرای برخی‌از سرویس‌های پیش‌زمینه‌ای درحالی‌که برنامه شما در پس‌زمینه است اعمال می‌کند. درحال‌حاضر، این محدودیت فقط برای سرویس‌های پیش‌زمینه‌ای dataSync و mediaProcessing نوع سرویس پیش‌زمینه‌ای اعمال می‌شود. محدودیت‌های محدودکننده‌تری برای نوع سرویس پیش‌زمینه‌ای shortService وجود دارد که در اسناد آن نوع سرویس مورد بحث قرار گرفته است.

رفتار درنگ

سیستم به سرویس‌های پیش‌زمینه‌ای dataSync و mediaProcessing اجازه می‌دهد درمجموع ۶ ساعت در یک دوره ۲۴ ساعته اجرا شوند، پس‌از آن سیستم روش Service.onTimeout(int, int) سرویس درحال اجرا را فراخوانی می‌کند (در Android 15 معرفی شده است). (نوع سرویس پیش‌زمینه‌ای mediaProcessing در Android 15 اضافه شده است.) محدودیت زمانی شش ساعته به‌طور جداگانه برای سرویس‌های dataSync و mediaProcessing ردیابی می‌شود. برای مثال، اگر سرویس dataSync فقط یک ساعت اجرا شده باشد، برنامه فقط پنج ساعت برای سرویس‌های پیش‌زمینه‌ای dataSync دردسترس خواهد داشت، اما شش ساعت کامل برای سرویس‌های mediaProcessing دردسترس خواهد داشت.

وقتی سرویس پیش‌زمینه‌ای به محدودیت شش ساعته می‌رسد، سرویس چند ثانیه فرصت دارد تا 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]"

برای جلوگیری از بروز مشکل با این تغییر رفتار، می‌توانید یک یا چند مورد از کارهای زیر را انجام دهید:

  1. سرویس شما باید روش جدید Service.onTimeout(int, int) را پیاده‌سازی کند. وقتی برنامه‌تان تماس برگشتی را دریافت می‌کند، حتماً ظرف چند ثانیه با stopSelf() تماس بگیرید. (اگر برنامه را فوراً متوقف نکنید، سیستم خطایی ایجاد می‌کند.)
  2. مطمئن شوید که سرویس‌های dataSync و mediaProcessing برنامه‌تان در هر دوره ۲۴ ساعته درمجموع بیش‌از ۶ ساعت اجرا نشوند (مگر اینکه کاربر با برنامه تعامل داشته باشد که دراین‌صورت زمان‌سنج بازنشانی می‌شود).
  3. فقط سرویس‌های پیش‌زمینه‌ای dataSync یا mediaProcessing را درنتیجه تعامل مستقیم کاربر شروع کنید؛ چون وقتی سرویس شروع می‌شود برنامه‌تان در پیش‌زمینه است، سرویس شما شش ساعت کامل پس‌از رفتن برنامه به پس‌زمینه فرصت دارد.
  4. به‌جای استفاده از این سرویس‌های پیش‌زمینه‌ای، از میانای برنامه‌سازی کاربردی جایگزین، مثل WorkManager، استفاده کنید. به‌ویژه، به‌جای استفاده از dataSync سرویس پیش‌زمینه‌ای، بهتر است از میانای برنامه‌سازی کاربردی جایگزین استفاده کنید.

اگر سرویس‌های پیش‌زمینه‌ای dataSync برنامه‌تان به‌مدت ۶ ساعت در ۲۴ ساعت گذشته اجرا شده باشد، نمی‌توانید سرویس پیش‌زمینه‌ای 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