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

אם אפליקציה מטרגטת ל-Android 15 ומעלה, המערכת מגבילה את משך הזמן שבו שירותים מסוימים שפועלים בחזית יכולים לפעול כשהאפליקציה פועלת ברקע. נכון לעכשיו, ההגבלה הזו חלה רק על שירותים שפועלים בחזית מסוג dataSync ו-mediaProcessing. יש מגבלות מחמירות יותר על סוג השירות שפועל בחזית shortService, שמפורטות במסמכי התיעוד של סוג השירות הזה.

התנהגות הזמן הקצוב לתפוגה

המערכת מאפשרת לשירותים שפועלים בחזית מסוג dataSync ו-mediaProcessing לפעול במשך 6 שעות בסך הכול בפרק זמן של 24 שעות. לאחר מכן, המערכת קוראת ל-method‏ Service.onTimeout(int, int) של השירות שפועל (הוצג ב-Android 15). (סוג השירות שפועל בחזית mediaProcessing נוסף ב-Android 15). מגבלת הזמן של שש שעות נמדדת בנפרד לשירותי dataSync ולשירותי mediaProcessing. לדוגמה, אם שירות מסוג dataSync פעל במשך שעה, לאפליקציה יהיו רק חמש שעות זמינות לשירותים שפועלים בחזית מסוג dataSync, אבל יהיו לה שש שעות מלאות זמינות לשירותים מסוג mediaProcessing.

כשהשירות שפועל בחזית מגיע למגבלה של שש שעות, יש לו כמה שניות להפעיל את 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