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