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

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

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

  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