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