זמן קצוב לתפוגה של שירות שפועל בחזית

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

כדי למנוע בעיות שקשורות לשינוי הזה בהתנהגות, אפשר לבצע אחת או יותר מהפעולות הבאות:

  1. מטמיעים את השיטה החדשה Service.onTimeout(int, int) בשירות. כשהאפליקציה תקבל את הקריאה החוזרת, חשוב להתקשר למספר stopSelf() תוך כמה שניות. (אם לא מפסיקים את האפליקציה מיד, המערכת יוצרת כשל).
  2. חשוב לוודא שהשירותים dataSync ו-mediaProcessing של האפליקציה לא פועלים יותר מ-6 שעות בסך הכול בכל תקופה של 24 שעות (אלא אם המשתמש יוצר אינטראקציה עם האפליקציה, ומאפס את הטיימר).
  3. כדאי להפעיל שירותים dataSync או mediaProcessing בחזית רק כתוצאה מאינטראקציה ישירה של משתמש. מכיוון שהאפליקציה נמצאת בחזית כשהשירות מתחיל, השירות מקבל את שש השעות המלאות אחרי שהאפליקציה עוברת לרקע.
  4. במקום להשתמש בשירותים האלה שפועלים בחזית, כדאי להשתמש בממשק 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