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