אם אפליקציה מטרגטת ל-Android 15 ומעלה, המערכת מטילה מגבלות על משך הזמן שבו מותר להפעיל שירותים מסוימים שפועלים בחזית בזמן שהאפליקציה פועלת ברקע. נכון לעכשיו, ההגבלה הזו חלה רק על שירותים שפועלים בחזית מסוג dataSync
ועל שירותים שפועלים בחזית מסוג mediaProcessing
. יש מגבלות מחמירות יותר על shortService
סוג השירות שפועל בחזית, והן מפורטות במסמכי התיעוד של סוג השירות הזה.
התנהגות לאחר הזמן הקצוב לתפוגה
המערכת מאפשרת לשירותים שפועלים בחזית מסוג dataSync
ו-mediaProcessing
לפעול למשך 6 שעות בסך הכול במהלך תקופה של 24 שעות. לאחר מכן, המערכת קוראת ל-method 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]"
כדי למנוע בעיות שקשורות לשינוי הזה בהתנהגות, אפשר לבצע אחת או יותר מהפעולות הבאות:
- להטמיע בשירות את השיטה החדשה
Service.onTimeout(int, int)
. כשמתקבלת קריאה חוזרת באפליקציה, חשוב להתקשר אלstopSelf()
תוך כמה שניות. (אם לא מפסיקים את האפליקציה מיד, המערכת יוצרת כשל). - חשוב לוודא שהשירותים
dataSync
ו-mediaProcessing
של האפליקציה לא פועלים יותר מ-6 שעות בסך הכול במהלך תקופה של 24 שעות (אלא אם המשתמש מקיים אינטראקציה עם האפליקציה, מה שמאפס את הטיימר). - הפעילו שירותים שפועלים בחזית
dataSync
אוmediaProcessing
רק כתוצאה מאינטראקציה ישירה של המשתמש. מכיוון שהאפליקציה פועלת בחזית כשהשירות מתחיל, השירות יפעל למשך שש שעות מלאות אחרי שהאפליקציה תעבור לרקע. - במקום להשתמש בשירותים שפועלים בחזית, צריך להשתמש בממשק 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
foreground, מריצים את הפקודה הבאה של 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