אם אפליקציה מטרגטת ל-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