ב-Android 10 (רמת API 29) ומעלה, יש הגבלות על המקרים שבהם אפליקציות יכולות להתחיל פעילויות כשהאפליקציה פועלת ברקע. ההגבלות האלה עוזרות לצמצם את ההפרעות למשתמשים ולאפשר להם יותר שליטה על מה שמוצג במסך שלהם.
במדריך הזה מוצגות התראות כחלופה להפעלת פעילויות מהרקע. בנוסף, מפורטים המקרים הספציפיים שבהם ההגבלה לא חלה.
הצגת התראות במקום זאת
ברוב המקרים, אפליקציות שפועלות ברקע צריכות להציג התראות דחופות כדי לספק למשתמש מידע חשוב, במקום להתחיל פעילות באופן ישיר. ההתראות האלה כוללות טיפול בשיחה טלפונית נכנסת או בשעון מעורר פעיל.
למערכת ההתראות והתזכורות הזו יש כמה יתרונות למשתמשים:
- במהלך השימוש במכשיר, המשתמש יראה התראה קופצת שתאפשר לו להגיב. המשתמש שומר על ההקשר הנוכחי שלו ויש לו שליטה על התוכן שמוצג במסך.
- התראות דחופות מכבדות את הכללים של מצב נא לא להפריע שהמשתמש הגדיר. לדוגמה, המשתמשים יכולים לאפשר שיחות רק מאנשי קשר ספציפיים או ממתקשרים חוזרים כשהמצב 'נא לא להפריע' מופעל.
- כשהמסך של המכשיר כבוי, ה-Intent למסך מלא מופעל באופן מיידי.
- במסך ההגדרות של המכשיר, המשתמש יכול לראות אילו אפליקציות שלחו התראות לאחרונה, כולל התראות מערוצי התראות ספציפיים. במסך הזה, המשתמש יכול לשלוט בהעדפות שלו לגבי התראות.
מתי אפליקציות יכולות להתחיל פעילויות
אפליקציות שפועלות ב-Android 10 ומעלה יכולות להתחיל פעילויות כשמתקיים אחד או יותר מהתנאים הבאים:
- לאפליקציה יש חלון גלוי, כמו פעילות בחזית.
- לאפליקציה יש פעילות במחסנית האחורית של המשימה בחזית.
האפליקציה כוללת פעילות במחסנית האחורית של משימה קיימת במסך האפליקציות האחרונות.
באפליקציה יש פעילות שהתחילה לאחרונה.
האפליקציה שנקראת
finish()
הפעילה פעילות לאחרונה. ההגדרה הזו רלוונטית רק אם לאפליקציה הייתה פעילות בחזית או פעילות במחסנית האחורית של המשימה בחזית בזמן הקריאה ל-finish()
.האפליקציה כוללת אחד מהשירותים הבאים שקשורים למערכת. יכול להיות שיהיה צורך להפעיל ממשק משתמש בשירותים האלה.
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
-
TileService
(לא רלוונטי ב-Android 14 (רמת API 34) ומעלה) VoiceInteractionService
VrListenerService
.
לאפליקציה יש שירות שקשור לאפליקציה אחרת שמוצגת. האפליקציה שקשורה לשירות חייבת להישאר גלויה כדי שהאפליקציה ברקע תוכל להתחיל פעילויות בהצלחה.
האפליקציה מקבלת התראה
PendingIntent
מהמערכת. במקרה של כוונות בהמתנה לשירותים ולמקלט שידורים, האפליקציה יכולה להתחיל פעילויות למשך כמה שניות אחרי שליחת הכוונה בהמתנה.האפליקציה מקבלת
PendingIntent
שנשלח מאפליקציה אחרת שניתן לראות אותה.האפליקציה מקבלת שידור מערכת שבו האפליקציה אמורה להפעיל ממשק משתמש. דוגמאות לתוכן מהסוג הזה:
ACTION_NEW_OUTGOING_CALL
ו-SECRET_CODE_ACTION
. יכול להיות שהאפליקציה תתחיל פעילויות כמה שניות אחרי שליחת השידור.האפליקציה משויכת למכשיר חומרה נלווה דרך ה-API
CompanionDeviceManager
. ה-API הזה מאפשר לאפליקציה להתחיל פעילויות בתגובה לפעולות שהמשתמש מבצע במכשיר מותאם.האפליקציה היא בקר מדיניות המכשיר שפועל במצב בעלי המכשיר. תרחישים לדוגמה לשימוש ב-Android Management כוללים מכשירים ארגוניים בניהול מלא וגם מכשירים ייעודיים כמו שילוט דיגיטלי וקיוסקים.
המשתמש מעניק לאפליקציה את ההרשאה
SYSTEM_ALERT_WINDOW
.
נדרשת הסכמה להצטרפות כשמתחילים פעילויות מ-PendingIntents
כדי למנוע הפעלת פעילות בטעות על סמך התנאים המפורטים, החל מ-Android 14 יש ממשקי API מפורשים שמאפשרים להביע הסכמה או להתנגד למתן הרשאות לאפליקציה להפעלת פעילות.
אפליקציות שמטרגטות ל-Android בגרסה 15 ואילך לא יקבלו יותר כברירת מחדל הרשאות להפעלת פעילות ברקע (BAL) עבור PendingIntents
שהן יוצרות. נדרשת הסכמה מפורשת של המשתמשים. כדי לקבל אותה, אפשר להשתמש באפשרויות הבאות, בהתאם לאופן שבו האפליקציה שולחת או יוצרת PendingIntents
.
לפי השולח של PendingIntent
אפליקציות שמטרגטות ל-Android מגרסה 14 ואילך שרוצות להפעיל PendingIntent
צריכות
- עומדים בתנאים המפורטים ו
- להביע הסכמה להפעלת פעילות ברקע על סמך החריגים האלה
ההסכמה הזו צריכה לקרות רק אם מפתח האפליקציה יודע שהאפליקציה עומדת להתחיל פעילות.
כדי להצטרף, האפליקציה צריכה להעביר חבילת ActivityOptions
עם
setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
ל-PendingIntent.send()
או לשיטות דומות.
על ידי היוצר של PendingIntent
אפליקציות שמטרגטות את Android 15 ואילך ויוצרות PendingIntent
חייבות עכשיו להביע הסכמה מפורשת להפעלת פעילות ברקע אם הן רוצות שניתן יהיה להפעיל את ה-PendingIntents
האלה בתנאים שמפורטים.
ברוב המקרים, האפליקציה שמתחילה את PendingIntent
היא זו שצריכה להצטרף.
עם זאת, אם האפליקציה היוצרת צריכה להעניק את ההרשאות האלה:
- אפשר להתחיל את
PendingIntent
בכל שלב שבו האפליקציה שיוצרת את הקוד גלויה. - אפשר להפעיל את
PendingIntent
בכל שלב אם לאפליקציה היוצרת יש הרשאות מיוחדות.
כדי להצטרף, האפליקציה צריכה להעביר חבילת ActivityOptions
עם setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
אל PendingIntent.getActivity()
או אל שיטות דומות.
פרטים נוספים זמינים במאמרי העזרה הרלוונטיים:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
מצב קפדני
החל מ-Android 16, מפתח האפליקציה יכול להפעיל מצב קפדני כדי לקבל הודעה כשפעילות מופעלת ונחסמת (או כשיש סיכון שהיא תיחסם אם ה-SDK של יעד האפליקציה יעלה).
קוד לדוגמה להפעלה מוקדמת באפליקציה, בפעילות או ברכיב אחר של האפליקציה בשיטה Application.onCreate()
:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
פרטים נוספים זמינים במאמר בנושא מצב קפדני.