החל מ-Android 14 (רמת API 34), צריך להצהיר על סוג שירות מתאים לכל שירות שפועל בחזית. כלומר, אתם צריכים להצהיר על סוג השירות במניפסט של האפליקציה, וגם לבקש את ההרשאה המתאימה לשירות שפועל בחזית עבור הסוג הזה (בנוסף לבקשת ההרשאה FOREGROUND_SERVICE). בנוסף, בהתאם לסוג השירות שפועל בחזית, יכול להיות שתצטרכו לבקש הרשאות בזמן ריצה לפני שתפעילו את השירות.
מצלמה
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceType camera- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_CAMERA- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_CAMERA- דרישות מוקדמות להפעלה
שליחת בקשה להרשאת זמן ריצה של
CAMERAוקבלת אישור- תיאור
המשך גישה למצלמה מהרקע, למשל באפליקציות של וידאו צ'אט שמאפשרות ריבוי משימות.
המכשיר המחובר
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypeconnectedDevice- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_CONNECTED_DEVICE- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- דרישות מוקדמות בסביבת זמן הריצה
לפחות אחד מהתנאים הבאים חייב להתקיים:
צריך להצהיר על לפחות אחת מההרשאות הבאות במניפסט:
צריך לבקש לפחות אחת מההרשאות הבאות בסביבת זמן הריצה, ולקבל אותה:
התקשרו למספר
UsbManager.requestPermission()
- תיאור
אינטראקציות עם מכשירים חיצוניים שדורשים חיבור Bluetooth, NFC, IR, USB או חיבור לרשת.
- אפשרויות אחרות
אם באפליקציה שלכם יש צורך לבצע העברה רציפה של נתונים למכשיר חיצוני, כדאי להשתמש במקום זאת במנהל המכשיר הנלווה. אתם יכולים להשתמש ב-companion device presence API כדי לעזור לאפליקציה להמשיך לפעול בזמן שהמכשיר הנלווה נמצא בטווח.
אם האפליקציה שלכם צריכה לסרוק מכשירי Bluetooth, כדאי להשתמש ב-Bluetooth scan API במקום זאת.
סנכרון נתונים
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypedataSync- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_DATA_SYNC- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_DATA_SYNC- דרישות מוקדמות להפעלה
- ללא
- תיאור
פעולות העברת נתונים, כמו:
- העלאה או הורדה של נתונים
- פעולות גיבוי ושחזור
- פעולות ייבוא או ייצוא
- אחזור נתונים
- עיבוד קבצים מקומי
- העברת נתונים בין מכשיר לבין הענן דרך רשת
- אפשרויות אחרות
מידע מפורט זמין במאמר חלופות לשירותים להעברת נתונים ברקע.
בריאות
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypehealth- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_HEALTH- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_HEALTH- דרישות מוקדמות בסביבת זמן הריצה
לפחות אחד מהתנאים הבאים חייב להתקיים:
מצהירים על ההרשאה
HIGH_SAMPLING_RATE_SENSORSבמניפסט.צריך לבקש לפחות אחת מההרשאות הבאות בסביבת זמן הריצה, ולקבל אותה:
- תיאור
תרחישים לדוגמה לטווח ארוך לתמיכה באפליקציות בקטגוריית הכושר, כמו מכשירי מעקב אחר אימונים.
מיקום
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypelocation- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_LOCATION- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_LOCATION- דרישות מוקדמות בסביבת זמן הריצה
המשתמש צריך להפעיל את שירותי המיקום, והאפליקציה צריכה לקבל לפחות אחת מההרשאות הבאות בסביבת זמן הריצה:
- תיאור
תרחישים לדוגמה לטווח ארוך שדורשים גישה למיקום, כמו ניווט ושיתוף מיקום.
- אפשרויות אחרות
אם אתם רוצים שהאפליקציה תופעל כשהמשתמש מגיע למיקומים ספציפיים, מומלץ להשתמש ב-Geofence API במקום ב-Location API.
מדיה
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypemediaPlayback- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_MEDIA_PLAYBACK- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK- דרישות מוקדמות להפעלה
- ללא
- תיאור
להמשיך להפעיל אודיו או סרטון ברקע. תמיכה בפונקציונליות של הקלטת וידאו דיגיטלית (DVR) ב-Android TV.
- אפשרויות אחרות
אם מציגים סרטון במצב 'תמונה בתוך תמונה', צריך להשתמש במצב 'תמונה בתוך תמונה'.
המדיה נמצאת בעיבוד
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypemediaProcessing- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_MEDIA_PROCESSING- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING- דרישות מוקדמות בסביבת זמן הריצה
- ללא
- תיאור
שירות לביצוע פעולות שדורשות זמן רב בנכסי מדיה, כמו המרת מדיה לפורמטים שונים. המערכת מאפשרת לשירות הזה לפעול למשך זמן מוגבל. בנסיבות רגילות, מגבלת הזמן הזו היא 6 שעות מתוך 24 שעות. (המגבלה הזו משותפת לכל
mediaProcessingהשירותים של האפליקציה בחזית).האפליקציה צריכה להפסיק באופן ידני את שירות עיבוד המדיה בתרחיש הבא:
- כשפעולת ההמרה מסתיימת או מגיעה למצב של כשל, צריך לגרום לשירות לקרוא ל-
Service.stopForeground()ול-Service.stopSelf()כדי להפסיק את השירות לגמרי.
- כשפעולת ההמרה מסתיימת או מגיעה למצב של כשל, צריך לגרום לשירות לקרוא ל-
אם חלפו פרק הזמן של הזמן הקצוב לתפוגה, המערכת קוראת לשיטה
Service.onTimeout(int, int)של השירות. בשלב הזה, לשירות יש כמה שניות כדי להתקשר אלService.stopSelf(). אם השירות לא קורא ל-Service.stopSelf(), תתרחש הודעת ANR עם הודעת השגיאה הבאה: "A foreground service of <fgs_type> did not stop within its timeout: <component_name>".הערה: השדה
Service.onTimeout(int, int)לא זמין ב-Android מגרסה 14 ומטה. במכשירים עם הגרסאות האלה, אם שירות עיבוד מדיה מגיע למועד הקצוב לתפוגה, המערכת מאחסנת את האפליקציה במטמון באופן מיידי. לכן, האפליקציה לא צריכה להמתין לקבלת התראה על תפוגת הזמן. במקום זאת, היא צריכה לסיים את השירות שפועל בחזית או לשנות אותו לשירות שפועל ברקע בהקדם האפשרי.
הקרנת מדיה
- 要在清单中声明的前台服务类型,位于
android:foregroundServiceTypemediaProjection- 要在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PROJECTION- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- 运行时前提条件
在启动前台服务之前,调用
createScreenCaptureIntent()方法。这样做会向用户显示权限通知;用户必须授予权限,您才能创建服务。创建前台服务后,您可以调用
MediaProjectionManager.getMediaProjection()。- 说明
使用
MediaProjectionAPI 将内容投影到非主要显示屏或外部设备。这些内容不必全都为媒体内容。- 替代方案
如需将媒体内容流式传输到其他设备,请使用 Google Cast SDK。
מיקרופון
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypemicrophone- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_MICROPHONE- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_MICROPHONE- דרישות מוקדמות להפעלה
שולחים בקשה להרשאה
RECORD_AUDIOבתחילת ההפעלה ומקבלים אותה.- תיאור
להמשיך להקליט מהמיקרופון ברקע, למשל באפליקציות להקלטת קול או באפליקציות לתקשורת.
שיחת טלפון
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypephoneCall- הרשאה להצהרה במניפסט
FOREGROUND_SERVICE_PHONE_CALL- קבוע להעברה אל
startForeground() FOREGROUND_SERVICE_TYPE_PHONE_CALL- דרישות מוקדמות להפעלה
לפחות אחד מהתנאים הבאים צריך להתקיים:
- האפליקציה הצהירה על ההרשאה
MANAGE_OWN_CALLSבקובץ המניפסט שלה.
- האפליקציה הצהירה על ההרשאה
- האפליקציה מוגדרת כאפליקציית ברירת המחדל לחיוג דרך התפקיד
ROLE_DIALER.
- האפליקציה מוגדרת כאפליקציית ברירת המחדל לחיוג דרך התפקיד
- תיאור
להמשיך שיחה פעילה באמצעות ממשקי ה-API של
ConnectionService.- אפשרויות אחרות
אם אתם צריכים להתקשר בטלפון, בשיחת וידאו או ב-VoIP, כדאי להשתמש בספרייה
android.telecom.כדאי להשתמש ב-
CallScreeningServiceכדי לסנן שיחות.
העברת הודעות מרחוק
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTyperemoteMessaging- 在清单中声明的权限
FOREGROUND_SERVICE_REMOTE_MESSAGING- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING- 运行时前提条件
- 无
- 说明
- 将短信从一台设备转移到另一台设备。在用户切换设备时,帮助确保用户消息任务的连续性。
שירות קצר
- סוג השירות שפועל בחזית שצריך להצהיר עליו במניפסט בקטע
android:foregroundServiceTypeshortService- הרשאה להצהרה במניפסט
- ללא
- קבוע להעברה אל
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. לכן, מומלץ להטמיע את פונקציית ה-callbackService.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:foregroundServiceTypespecialUse- 在清单中声明的权限
FOREGROUND_SERVICE_SPECIAL_USE- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_SPECIAL_USE- 运行时前提条件
- 无
- 说明
涵盖其他前台服务类型未涵盖的所有有效前台服务用例。
除了声明
FOREGROUND_SERVICE_TYPE_SPECIAL_USE前台服务类型之外,开发者还应在清单中声明用例。为此,他们会在<service>元素内指定<property>元素。这些值和相应的应用场景 。用途 您提供的案例均为自由形式,因此,您应确保提供足够的 相关信息,让审核人员了解您为何需要使用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:foregroundServiceTypesystemExempted- הרשאה להצהרה במניפסט
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 זמין במאמר הסבר על שירותים שפועלים בחזית ועל הדרישות לגבי כוונות במסך מלא.