前台服务类型是必需的

כדי לעזור למפתחים להגדיר בצורה מכוונת יותר שירותים שפועלים בחזית שגלויים למשתמשים, ב-Android 10 הוספנו את המאפיין android:foregroundServiceType לרכיב <service>.

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

אם תרחיש לדוגמה באפליקציה שלכם לא משויך לאף אחד מהסוגים האלה, מומלץ מאוד להעביר את הלוגיקה שלכם כך שתשתמש ב-WorkManager או במשימות להעברת נתונים שמבוצעות ביוזמת המשתמש.

הסוגים health, remoteMessaging, shortService, specialUse ו-systemExempted הם חדשים ב-Android 14.

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

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <application ...>
      <service
          android:name=".MyMediaPlaybackService"
          android:foregroundServiceType="mediaPlayback"
          android:exported="false">
      </service>
    </application>
</manifest>

אם אפליקציה שמטרגטת את Android 14 לא מגדירה סוגי שירות מסוימים במניפסט, המערכת תרים את השגיאה MissingForegroundServiceTypeException בקריאה ל-startForeground() לשירות הזה.

声明新权限来使用前台服务类型

אם אפליקציות שמטרגטות את Android 14 נעזרות בשירות שפועל בחזית, הן צריכות להצהיר על הרשאה ספציפית, בהתאם לסוג השירות שפועל בחזית, שהוצגה ב-Android 14. ההרשאות האלה מופיעות בקטעים שמסומנים בתווית 'הרשאה שצריך להצהיר עליה בקובץ המניפסט' בקטע תרחישים לדוגמה ותהליך האכיפה לכל סוג של שירות שפועל בחזית בדף הזה.

כל ההרשאות מוגדרות כהרשאות רגילות ומוקצות כברירת מחדל. המשתמשים לא יכולים לבטל את ההרשאות האלה.

在运行时包含前台服务类型

השיטה המומלצת לאפליקציות שמפעילות שירותים שפועלים בחזית היא להשתמש בגרסה ServiceCompat של startForeground() (זמינה ב-androidx-core 1.12 ואילך), שבה מעבירים מספר שלם בינארי של סוגי השירותים שפועלים בחזית. אפשר לבחור להעביר ערך טיפוס אחד או יותר.

בדרך כלל, צריך להצהיר רק על הסוגים הנדרשים לתרחיש לדוגמה מסוים. כך קל יותר לעמוד בציפיות של המערכת לגבי כל סוג של שירות שפועל בחזית. במקרים שבהם שירות שפועל בחזית מופעל עם כמה סוגים, השירות שפועל בחזית צריך לעמוד בדרישות האכיפה של הפלטפורמה של כל הסוגים.

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

אם לא מציינים את סוג השירות שפועל בחזית בקריאה, הערך שמוגדר כברירת מחדל הוא הערכים שמוגדרים במניפסט. אם לא ציינתם את סוג השירות במניפסט, המערכת תשליך את השגיאה MissingForegroundServiceTypeException.

אם לשירות שפועל בחזית נדרשות הרשאות חדשות אחרי ההפעלה שלו, צריך להפעיל שוב את startForeground() ולהוסיף את סוגי השירות החדשים. לדוגמה, נניח שאפליקציית כושר מפעילה שירות למעקב אחר ריצה שתמיד צריך להשתמש בו במידע location, אבל יכול להיות שהוא לא יצטרך הרשאות media. חשוב להצהיר גם על location וגם על mediaPlayback במניפסט. אם משתמש מתחיל ריצה ורוצה לעקוב רק אחרי המיקום שלו, האפליקציה צריכה לקרוא ל-startForeground() ולהעביר רק את סוג השירות location. לאחר מכן, אם המשתמש רוצה להפעיל את האודיו, קוראים שוב startForeground() ומעבירים את location|mediaPlayback.

系统运行时检查

המערכת בודקת אם נעשה שימוש תקין בסוגי שירותים שפועלים בחזית, ומאשרת שהאפליקציה ביקשה את הרשאות זמן הריצה המתאימות או משתמשת בממשקי ה-API הנדרשים. לדוגמה, המערכת מצפה שאפליקציות שמשתמשות בשירות שפועל בחזית מסוג FOREGROUND_SERVICE_TYPE_LOCATION יבקשו את ההרשאה ACCESS_COARSE_LOCATION או ACCESS_FINE_LOCATION.

המשמעות היא שאפליקציות צריכות לפעול לפי סדר פעולות ספציפי מאוד כשהן מבקשות הרשאות מהמשתמשים ומפעילות שירותים שפועלים בחזית. צריך לבקש את ההרשאות ולהעניק אותן לפני שהאפליקציה תנסה לבצע קריאה ל-startForeground(). אפליקציות שמבקשות את ההרשאות המתאימות אחרי שהשירות שפועל בחזית הופעל צריכות לשנות את סדר הפעולות ולבקש את ההרשאה לפני הפעלת השירות שפועל בחזית.

הפרטים של אכיפת הפלטפורמה מופיעים בקטעים שמסומנים בתווית 'דרישות בסביבת זמן הריצה' בקטע תרחישים לדוגמה ותהליך האכיפה של כל סוג של שירות שפועל בחזית בדף הזה.

每种前台服务类型的预期用例和强制执行

כדי להשתמש בסוג מסוים של שירות שפועל בחזית, צריך להצהיר על הרשאה מסוימת בקובץ המניפסט, לעמוד בדרישות ספציפיות בסביבת זמן הריצה, והאפליקציה צריכה לעמוד באחד מהתרחישי לדוגמה שמיועדים לסוג הזה. בקטעים הבאים מוסבר מהי ההרשאה שצריך להצהיר עליה, מהן הדרישות המוקדמות בסביבת זמן הריצה ומה הם תרחישים לדוגמה שבהם נעשה שימוש בכל סוג.

相机

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע android:foregroundServiceType
camera
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_CAMERA
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
דרישות מוקדמות בסביבת זמן הריצה

מבקשים את הרשאת זמן הריצה CAMERA ומקבלים אותה

הערה: ההרשאה בסביבת זמן הריצה CAMERA כפופה להגבלות במהלך השימוש. לכן, לא ניתן ליצור שירות camera שפועל בחזית בזמן שהאפליקציה פועלת ברקע, למעט כמה יוצאים מן הכלל. מידע נוסף זמין במאמר הגבלות על הפעלת שירותים שפועלים בחזית שצריכים הרשאות לשימוש.

תיאור

להמשיך לגשת למצלמה מהרקע, למשל באפליקציות של וידאו צ'אט שמאפשרות לבצע כמה משימות בו-זמנית.

连接的设备

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
connectedDevice
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_CONNECTED_DEVICE
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
דרישות מוקדמות בסביבת זמן הריצה

לפחות אחד מהתנאים הבאים חייב להתקיים:

תיאור

אינטראקציות עם מכשירים חיצוניים שדורשים חיבור Bluetooth,‏ NFC,‏ IR,‏ USB או חיבור לרשת.

אפשרויות אחרות

אם באפליקציה שלכם יש צורך לבצע העברה רציפה של נתונים למכשיר חיצוני, כדאי להשתמש במקום זאת במנהל המכשיר הנלווה. אתם יכולים להשתמש ב-companion device presence API כדי לעזור לאפליקציה להמשיך לפעול בזמן שהמכשיר הנלווה נמצא בטווח.

אם האפליקציה שלכם צריכה לסרוק מכשירי Bluetooth, כדאי להשתמש ב-Bluetooth scan API במקום זאת.

数据同步

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
dataSync
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_DATA_SYNC
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
דרישות מוקדמות בסביבת זמן הריצה
ללא
תיאור

פעולות העברת נתונים, כמו:

  • העלאה או הורדה של נתונים
  • פעולות גיבוי ושחזור
  • פעולות ייבוא או ייצוא
  • אחזור נתונים
  • עיבוד קבצים מקומי
  • העברת נתונים בין מכשיר לענן דרך רשת
אפשרויות אחרות

מידע מפורט זמין במאמר חלופות לשירותי חזית לסנכרון נתונים.

健康

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
health
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_HEALTH
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
דרישות מוקדמות בסביבת זמן הריצה

לפחות אחד מהתנאים הבאים חייב להתקיים:

הערה: ההרשאה בסביבת זמן הריצה BODY_SENSORS כפופה להגבלות במהלך השימוש. לכן אי אפשר ליצור שירות health שפועל בחזית ומשתמש בחיישנים גופניים בזמן שהאפליקציה נמצאת ברקע, למעט כמה יוצאים מן הכלל. מידע נוסף זמין במאמר הגבלות על הפעלת שירותים שפועלים בחזית שצריכים הרשאות לשימוש.

תיאור

תרחישים לדוגמה לטווח ארוך לתמיכה באפליקציות בקטגוריית הכושר, כמו מכשירי מעקב אחר אימונים.

位置

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
location
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_LOCATION
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
דרישות מוקדמות בסביבת זמן הריצה

המשתמש צריך להפעיל את שירותי המיקום, והאפליקציה צריכה לקבל לפחות אחת מההרשאות הבאות בסביבת זמן הריצה:

הערה: כדי לבדוק שהמשתמש הפעיל את שירותי המיקום וגם העניק גישה להרשאות בסביבת זמן הריצה, משתמשים ב-PermissionChecker#checkSelfPermission()

הערה: ההרשאות של מיקום זמן ריצה כפופות להגבלות בזמן השימוש. לכן, אי אפשר ליצור שירות location בחזית בזמן שהאפליקציה נמצאת ברקע, אלא אם קיבלתם את ההרשאה ACCESS_BACKGROUND_LOCATION בסביבת זמן הריצה. מידע נוסף זמין במאמר הגבלות על הפעלת שירותים שפועלים בחזית שצריכים הרשאות לשימוש.

תיאור

תרחישים לדוגמה לטווח ארוך שדורשים גישה למיקום, כמו ניווט ושיתוף מיקום.

אפשרויות אחרות

אם אתם רוצים שהאפליקציה תופעל כשהמשתמש מגיע למיקומים ספציפיים, מומלץ להשתמש ב-Geofence API במקום ב-Location API.

媒体

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
mediaPlayback
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_MEDIA_PLAYBACK
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
דרישות מוקדמות בסביבת זמן הריצה
ללא
תיאור
המשך ההפעלה של האודיו או הווידאו מהרקע. תמיכה בפונקציונליות של הקלטת וידאו דיגיטלית (DVR) ב-Android TV.
אפשרויות אחרות
אם אתם מציגים סרטון ב'תמונה בתוך תמונה', תוכלו להשתמש במצב 'תמונה בתוך תמונה'.

媒体投影

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
mediaProjection
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_MEDIA_PROJECTION
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
דרישות מוקדמות בסביבת זמן הריצה

צריך לקרוא ל-method‏ createScreenCaptureIntent() לפני שמפעילים את השירות שפועל בחזית. הפעולה הזו תציג למשתמש התראה על הרשאה, והמשתמש יצטרך להעניק את ההרשאה כדי שתוכלו ליצור את השירות.

אחרי שיוצרים את שירות החזית, אפשר להפעיל את השיטה MediaProjectionManager.getMediaProjection().

תיאור

הקרנת תוכן למסך לא ראשי או למכשיר חיצוני באמצעות ממשקי ה-API של MediaProjection. התוכן הזה לא חייב להיות תוכן מדיה בלבד.

אפשרויות אחרות

כדי להעביר מדיה בסטרימינג למכשיר אחר, משתמשים ב-Google Cast SDK.

麦克风

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
microphone
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_MICROPHONE
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_MICROPHONE
דרישות מוקדמות בסביבת זמן הריצה

מבקשים את ההרשאה RECORD_AUDIO בזמן הריצה ומקבלים אותה.

הערה: ההרשאה RECORD_AUDIO בסביבת זמן הריצה כפופה להגבלות במהלך השימוש. לכן, אי אפשר ליצור שירות microphone שפועל בחזית בזמן שהאפליקציה פועלת ברקע, למעט כמה יוצאים מן הכלל. מידע נוסף זמין במאמר הגבלות על הפעלת שירותים שפועלים בחזית שצריכים הרשאות לשימוש.

תיאור

המשך הקלטה מהמיקרופון ברקע, כמו מכשירי הקלטה קולית או אפליקציות תקשורת.

致电

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
phoneCall
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_PHONE_CALL
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
דרישות מוקדמות בסביבת זמן הריצה

לפחות אחד מהתנאים הבאים חייב להתקיים:

  • האפליקציה הצהירה על ההרשאה MANAGE_OWN_CALLS בקובץ המניפסט שלה.
  • האפליקציה היא אפליקציית החיוג שמוגדרת כברירת מחדל דרך התפקיד ROLE_DIALER.
תיאור

המשך שיחה פעילה באמצעות ממשקי ה-API של ConnectionService.

אפשרויות אחרות

אם אתם צריכים להתקשר בטלפון, בשיחות וידאו או ב-VoIP, כדאי להשתמש בספרייה android.telecom.

כדאי להשתמש ב-CallScreeningService כדי לסנן שיחות.

远程消息传递

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
remoteMessaging
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_REMOTE_MESSAGING
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
דרישות מוקדמות בסביבת זמן הריצה
ללא
תיאור
העברת הודעות טקסט ממכשיר אחד למכשיר אחר. מאפשרת למשתמשים להמשיך את משימות ההודעות שלהם כשהם עוברים בין מכשירים.

短期服务

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
shortService
הרשאה להצהרה במניפסט
ללא
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
דרישות מוקדמות בסביבת זמן הריצה
ללא
תיאור

לסיים במהירות עבודה קריטית שלא ניתן להפריע לה או לדחות אותה.

לסוג הזה יש כמה מאפיינים ייחודיים:

  • אפשר להריץ אותו רק לפרק זמן קצר (כ-3 דקות).
  • אין תמיכה בשירותי חזית דביקים.
  • אי אפשר להפעיל שירותים אחרים שפועלים בחזית.
  • לא נדרשת הרשאה ספציפית לסוג, אבל עדיין נדרשת ההרשאה FOREGROUND_SERVICE.
  • אפשר לשנות את shortService לסוג שירות אחר רק אם האפליקציה עומדת כרגע בדרישות להפעלת שירות חדש בחזית.
  • שירות שפועל בחזית יכול לשנות את הסוג שלו ל-shortService בכל שלב, ובאותו רגע מתחילה תקופת הזמן הקצובה.

הזמן הקצוב לתפוגה של shortService מתחיל מהרגע שבו מתבצעת הקריאה ל-Service.startForeground(). האפליקציה אמורה לבצע קריאה ל-Service.stopSelf() או ל-Service.stopForeground() לפני שהזמן יפוג. אחרת, Service.onTimeout() החדש ייוצר, ויינתן לאפליקציות הזדמנות קצרה להתקשר ל-stopSelf() או ל-stopForeground() כדי להפסיק את השירות שלהן.

זמן קצר אחרי הקריאה ל-Service.onTimeout(), האפליקציה נכנסת למצב שמאוחסן במטמון והיא כבר לא נחשבת לפעילה בחזית, אלא אם המשתמש מבצע אינטראקציה פעילה עם האפליקציה. זמן קצר אחרי שהאפליקציה מאוחסנת במטמון והשירות לא הופסק, האפליקציה מקבלת אירוע ANR. בהודעת ה-ANR מוזכר FOREGROUND_SERVICE_TYPE_SHORT_SERVICE. לכן, מומלץ להטמיע את פונקציית ה-callback‏ Service.onTimeout().

קריאת החזרה (call back) Service.onTimeout() לא קיימת ב-Android מגרסה 13 ומטה. אם אותו שירות פועל במכשירים כאלה, הוא לא מקבל זמן קצוב לתפוגה ולא מתרחשת בו בעיה מסוג ANR. חשוב לוודא שהשירות יפסיק לפעול ברגע שהוא יסיים את משימת העיבוד, גם אם הוא עדיין לא קיבל את הקריאה החוזרת (callback) של Service.onTimeout().

חשוב לציין שאם לא יתקיים הזמן הקצוב לתפוגה של shortService, תופיע באפליקציה שגיאת ANR גם אם פועלות בה שירותים חוקיים אחרים בחזית או תהליכים אחרים במחזור החיים של האפליקציה.

אם אפליקציה גלויה למשתמש או עומדת באחד מההחרגות שמאפשרות להפעיל שירותים שפועלים בחזית מהרקע, קריאה חוזרת ל-Service.StartForeground() עם הפרמטר FOREGROUND_SERVICE_TYPE_SHORT_SERVICE מאריכה את הזמן הקצוב לתפוגה ב-3 דקות נוספות. אם האפליקציה לא גלויה למשתמש ולא עומדת באחד מההחרגות, כל ניסיון להפעיל שירות נוסף שפועל בחזית, ללא קשר לסוג שלו, יגרום לForegroundServiceStartNotAllowedException.

אם משתמש משבית את אופטימיזציית הסוללה באפליקציה, היא עדיין מושפעת מזמן הקצאת הזמן הקצוב לתפוגה של shortService FGS.

אם מפעילים שירות שפועל בחזית שכולל את הסוג shortService וגם סוג אחר של שירות שפועל בחזית, המערכת מתעלמת מהצהרת הסוג shortService. עם זאת, השירות עדיין צריך לעמוד בדרישות המוקדמות של הסוגים האחרים שצוינו. מידע נוסף זמין במסמכי העזרה של שירותי חזית.

特殊用途

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
specialUse
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_SPECIAL_USE
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
דרישות מוקדמות לסביבת זמן ריצה
ללא
תיאור

רלוונטי לתרחישים לדוגמה תקינים של שירות שפועל בחזית, שלא נכללים בפלטפורמה האחרת סוגי השירותים שפועלים בחזית.

בנוסף להצהרה על FOREGROUND_SERVICE_TYPE_SPECIAL_USE בסוג השירות שפועל בחזית, מפתחים צריכים להצהיר על תרחישים לדוגמה . כדי לעשות זאת, הן מציינות את הרכיב <property> שבתוך רכיב <service>. הערכים האלה ותרחישי השימוש המתאימים נבדקים כששולחים את האפליקציה ל-Google Play Console. תרחישי השימוש שאתם מספקים יכולים להיות בכל צורה, וצריך לוודא שאתם מספקים מספיק מידע כדי לאפשר למבקר להבין למה אתם צריכים להשתמש בסוג specialUse.

<service android:name="fooService" android:foregroundServiceType="specialUse">
  <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
      android:value="explanation_for_special_use"/>
</service>

系统豁免

סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType
systemExempted
הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
קבוע להעברה אל startForeground()
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
דרישות מוקדמות בסביבת זמן הריצה
ללא
תיאור

הרשאה ששמורה לאפליקציות מערכת ולשילובים ספציפיים של מערכת, כדי להמשיך להשתמש בשירותים שפועלים בחזית.

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

  • המכשיר נמצא במצב הדגמה
  • האפליקציה היא בעלים של מכשיר
  • האפליקציה היא בעלים של פרופיל
  • אפליקציות בטיחות עם התפקיד ROLE_EMERGENCY
  • אפליקציות של ניהול מכשירים
  • אפליקציות עם ההרשאה SCHEDULE_EXACT_ALARM או USE_EXACT_ALARM שמשתמשות בשירות שפועל בחזית כדי להמשיך להפעיל התראות ברקע, כולל התראות עם משוב מישוש בלבד.
  • אפליקציות VPN (שמוגדרות באמצעות הגדרות > רשת ואינטרנט > VPN)

    אחרת, ההצהרה על הסוג הזה תגרום למערכת להפעיל ForegroundServiceTypeNotAllowedException.

使用前台服务类型时强制执行的 Google Play 政策

אם האפליקציה שלכם מטרגטת את Android מגרסה 14 ואילך, תצטרכו להצהיר על סוגי השירותים של האפליקציה בחזית בדף 'תוכן האפליקציה' ב-Play Console (Policy (מדיניות) > App content (תוכן האפליקציה)). מידע נוסף על הצהרת סוגי השירותים שפועלים בחזית ב-Play Console זמין במאמר הסבר על שירותים שפועלים בחזית ועל הדרישות לגבי כוונות במסך מלא.