זמן קצוב לתפוגה של שירות שפועל בחזית

אם אפליקציה מטרגטת ל-Android 15 ואילך, המערכת מטילה מגבלות על משך הזמן שבו מותר להפעיל שירותים מסוימים שפועלים בחזית בזמן שהאפליקציה פועלת ברקע. בשלב הזה, ההגבלה הזו חלה רק על שירותים שפועלים בחזית מסוג dataSync ועל שירותים שפועלים בחזית מסוג mediaProcessing. יש מגבלות מחמירות יותר על shortServiceסוג השירות שפועל בחזית, והן מפורטות במסמכי התיעוד של סוג השירות הזה.

התנהגות של זמן קצוב לתפוגה

המערכת מאפשרת לשירותים שפועלים בחזית מסוג dataSync ו-mediaProcessing לפעול למשך 6 שעות בסך הכול במהלך תקופה של 24 שעות. לאחר מכן, המערכת קוראת לשיטה Service.onTimeout(int, int) של השירות הפועל (הוצגה ב-Android 15). (סוג השירות שפועל בחזית mediaProcessing foreground service נוסף ב-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 של האפליקציה לא פועלים יותר מ-6 שעות בסך הכול במהלך תקופה של 24 שעות (אלא אם המשתמש מקיים אינטראקציה עם האפליקציה, מה שמאפס את הטיימר).
  3. הפעלה של שירותים שפועלים בחזית dataSync או mediaProcessing צריכה להתבצע רק כתוצאה מאינטראקציה ישירה של המשתמש. מכיוון שהאפליקציה פועלת בחזית כשהשירות מופעל, השירות יפעל למשך שש שעות מלאות אחרי שהאפליקציה תעבור לרקע.
  4. במקום להשתמש בשירותים שפועלים בחזית, צריך להשתמש בממשק API חלופי, כמו WorkManager. במיוחד, במקום להשתמש בשירות שפועל בחזית dataSync, כדאי להשתמש ב-API חלופי.

אם השירותים שפועלים בחזית באפליקציה שלך dataSync פעלו במשך 6 שעות ב-24 השעות האחרונות, לא תהיה לך אפשרות להפעיל שירות נוסף שפועל בחזית 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