אפליקציות שמטרגטות את Android מגרסה 12 (רמת API 31) ואילך לא יכולות להפעיל שירותים שפועלים בחזית בזמן שהאפליקציה פועלת ברקע, מלבד כמה מקרים מיוחדים. אם אפליקציה מנסה להפעיל שירות שפועל בחזית בזמן שהאפליקציה פועלת ברקע, והשירות שפועל בחזית לא עומד באחד מהמקרים החריגים, המערכת תשליך ForegroundServiceStartNotAllowedException
.
בנוסף, אם אפליקציה רוצה להפעיל שירות שפועל בחזית שדורש הרשאות while-in-use (לדוגמה, חיישן גוף, מצלמה, מיקום או מיקרופון), היא לא יכולה ליצור את השירות בזמן שהאפליקציה פועלת ברקע, גם אם האפליקציה נכללת באחת מההחרגות מההגבלות על הפעלה ברקע. הסיבה לכך מוסברת בקטע הגבלות על הפעלת שירותים בחזית שצריכים הרשאות לשימוש.
החרגות מהגבלות על הפעלה מהרקע
במצבים הבאים, האפליקציה יכולה להפעיל שירותים שפועלים בחזית גם כשהיא פועלת ברקע:
- האפליקציה עוברת ממצב שגלוי למשתמשים, כמו פעילות.
- האפליקציה יכולה להפעיל פעילות מהרקע, מלבד במקרה שיש לאפליקציה פעילות בערימה האחורית של משימה קיימת.
האפליקציה מקבלת הודעה בעדיפות גבוהה באמצעות Firebase Cloud Messaging.
המשתמש מבצע פעולה ברכיב ממשק משתמש שקשור לאפליקציה. לדוגמה, הוא עשוי ליצור אינטראקציה עם בועה, הודעה, ווידג'ט או פעילות.
האפליקציה מפעילה התראה מדויקת כדי להשלים פעולה שהמשתמש מבקש.
האפליקציה היא שיטת הקלט הנוכחית של המכשיר.
האפליקציה מקבלת אירוע שקשור לגיאו-פיינס או למעבר של זיהוי פעילות.
אחרי שהמכשיר יופעל מחדש ויקבל את פעולת הכוונה
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
אוACTION_MY_PACKAGE_REPLACED
במקלט שידור.האפליקציה מקבלת את פעולת הכוונה
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
אוACTION_LOCALE_CHANGED
במקלט שידורים.האפליקציה מקבלת את האירוע
ACTION_TRANSACTION_DETECTED
מ-NfcService
.אפליקציות עם תפקידים או הרשאות מערכת מסוימים, כמו בעלי המכשיר ובעלי הפרופיל.
האפליקציה שלכם משתמשת ב-Companion Device Manager ומצהירה על ההרשאה
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
או על ההרשאהREQUEST_COMPANION_RUN_IN_BACKGROUND
. כשהדבר אפשרי, כדאי להשתמש ב-REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
.המשתמש משבית את האופטימיזציות של הסוללה באפליקציה.
לאפליקציה יש את ההרשאה
SYSTEM_ALERT_WINDOW
. הערה: אם האפליקציה שלכם מטרגטת את Android 15 ואילך, היא חייבת לקבל את ההרשאהSYSTEM_ALERT_WINDOW
ו חייבת להיות לה כרגע חלון שכבת-על גלוי.
הגבלות על הפעלת שירותים שפועלים בחזית שצריכים הרשאות לשימוש בזמן אמת
ב-Android 14 (רמת API 34) ואילך, יש מצבים מיוחדים שצריך להיות מודעים אליהם כשמפעילים שירות שפועל בחזית שדורש הרשאות לשימוש פעיל.
אם האפליקציה שלכם מטרגטת את Android 14 ואילך, מערכת ההפעלה בודקת בזמן יצירת השירות שפועל בחזית כדי לוודא שלאפליקציה יש את כל ההרשאות המתאימות לסוג השירות הזה. לדוגמה, כשיוצרים שירות שפועל בחזית מסוג microphone, מערכת ההפעלה מוודאת שלאפליקציה יש כרגע את ההרשאה RECORD_AUDIO
. אם אין לכם את ההרשאה הזו, המערכת תשליך את השגיאה SecurityException
.
כשמדובר בהרשאות לשימוש פעיל, המצב הזה עלול לגרום לבעיה. אם לאפליקציה יש הרשאה לשימוש בזמן השימוש, היא תהיה בתוקף רק כשהיא בחזית. כלומר, אם האפליקציה נמצאת ברקע ומנסה ליצור שירות בחזית מסוג מצלמה, מיקום או מיקרופון, המערכת מזהה שלאפליקציה אין כרגע את ההרשאות הנדרשות, ומפיקה את השגיאה SecurityException
.
באופן דומה, אם האפליקציה פועלת ברקע ויוצרת שירות בריאות שדורש את ההרשאה BODY_SENSORS
, לאפליקציה אין כרגע את ההרשאה הזו והמערכת תיצור חריגה.
(הכלל הזה לא חל על שירותי בריאות שצריכים הרשאות שונות, כמו ACTIVITY_RECOGNITION
). קריאה ל-PermissionChecker.checkSelfPermission()
לא מונעת את הבעיה הזו. אם לאפליקציה יש הרשאה לשימוש בזמן השימוש, והיא קורא ל-checkSelfPermission()
כדי לבדוק אם יש לה את ההרשאה הזו, ה-method מחזיר את הערך PERMISSION_GRANTED
גם אם האפליקציה נמצאת ברקע. כשהשיטה מחזירה את הערך PERMISSION_GRANTED
, המשמעות היא "האפליקציה שלך קיבלה את ההרשאה הזו בזמן השימוש באפליקציה".
לכן, אם לשירות בחזית נדרשת הרשאה לשימוש פעיל, צריך להפעיל את Context.startForegroundService()
או Context.bindService()
בזמן שהאפליקציה מציגה פעילות גלויה, אלא אם השירות נכלל באחד מהחריגים המוגדרים.
החרגות מההגבלות על הרשאות בזמן השימוש
במצבים מסוימים, גם אם שירות שפועל בחזית מופעל בזמן שהאפליקציה פועלת ברקע, הוא עדיין יכול לגשת למידע על המיקום, המצלמה והמיקרופון בזמן שהאפליקציה פועלת בחזית ('בזמן השימוש').
באותן סיטואציות, אם השירות מכריז על סוג שירות שפועל בחזית של location
והוא מופעל על ידי אפליקציה שיש לה את ההרשאה ACCESS_BACKGROUND_LOCATION
, השירות הזה יכול לגשת לפרטי המיקום כל הזמן, גם כשהאפליקציה פועלת ברקע.
המצבים האלה מפורטים ברשימה הבאה:
- רכיב מערכת מפעיל את השירות.
- השירות מתחיל לפעול באמצעות אינטראקציה עם ווידג'טים של אפליקציות.
- השירות מתחיל לפעול דרך אינטראקציה עם התראה.
- השירות מתחיל בתור
PendingIntent
שנשלח מאפליקציה אחרת גלויה. - השירות מופעל על ידי אפליקציה שהיא בקר מדיניות של מכשיר שפועלת במצב 'בעלי המכשיר'.
- השירות מופעל על ידי אפליקציה שמספקת את
VoiceInteractionService
. - השירות מופעל על ידי אפליקציה עם ההרשאה המיוחדת
START_ACTIVITIES_FROM_BACKGROUND
.
איך בודקים אילו שירותים מושפעים מהבעיה באפליקציה
כשבודקים את האפליקציה, מפעילים את השירותים שלה שפועלים בחזית. אם לשירות שהופעל יש גישה מוגבלת למיקום, למיקרופון ולמצלמה, ההודעה הבאה תופיע ב-Logcat:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME