ב-Android 10 (רמת API 29) ומעלה, יש הגבלות על המקרים שבהם אפליקציות יכולות להתחיל פעילויות כשהאפליקציה פועלת ברקע. ההגבלות האלה עוזרות לצמצם את ההפרעות למשתמשים ולאפשר להם לשלוט יותר במה שמוצג במסך שלהם.
במדריך הזה מוצגות התראות כחלופה להפעלת פעילויות מהרקע. בנוסף, מפורטים בו המקרים הספציפיים שבהם ההגבלה לא חלה.
הצגת התראות במקום זאת
ברוב המקרים, אפליקציות שפועלות ברקע צריכות להציג התראות דחופות כדי לספק למשתמש מידע חשוב, במקום להתחיל פעילות באופן ישיר. ההתראות האלה כוללות טיפול בשיחה טלפונית נכנסת או בשעון מעורר פעיל.
למערכת ההתראות והתזכורות הזו יש כמה יתרונות למשתמשים:
- במהלך השימוש במכשיר, המשתמש יראה התראה קופצת שתאפשר לו להגיב. המשתמש שומר על ההקשר הנוכחי שלו ויש לו שליטה על התוכן שמוצג במסך.
- ההתראות הדחופות פועלות בהתאם לכללים של מצב נא לא להפריע שהמשתמש הגדיר. לדוגמה, יכול להיות שהמשתמשים יאפשרו שיחות רק מאנשי קשר ספציפיים או ממתקשרים חוזרים כשהמצב 'נא לא להפריע' מופעל.
- כשהמסך של המכשיר כבוי, ה-Intent במסך מלא מופעל באופן מיידי.
- במסך ההגדרות של המכשיר, המשתמש יכול לראות אילו אפליקציות שלחו לאחרונה התראות, כולל התראות מערוצים ספציפיים. במסך הזה, המשתמש יכול לשלוט בהעדפות שלו לגבי התראות.
מתי אפליקציות יכולות להתחיל פעילויות
אפליקציות שפועלות ב-Android 10 ומעלה יכולות להתחיל פעילויות כשמתקיים אחד או יותר מהתנאים הבאים:
- לאפליקציה יש חלון גלוי, כמו פעילות בחזית.
- יש לאפליקציה פעילות במחסנית האחורית של המשימה בחזית.
האפליקציה כוללת פעילות במחסנית האחורית של משימה קיימת במסך האפליקציות האחרונות.
האפליקציה כוללת פעילות שהתחילה לאחרונה.
האפליקציה שנקראת
finish()ביצעה פעילות לאחרונה. ההגדרה הזו רלוונטית רק אם לאפליקציה הייתה פעילות בחזית או פעילות במחסנית האחורית של המשימה בחזית בזמן הקריאה ל-finish().האפליקציה כוללת אחד מהשירותים הבאים שקשורים למערכת. יכול להיות שיהיה צורך להפעיל ממשק משתמש בשירותים האלה.
AccessibilityServiceAutofillServiceCallRedirectionServiceHostApduServiceInCallService-
TileService(לא רלוונטי ב-Android 14 (רמת API 34) ומעלה) VoiceInteractionServiceVrListenerService.
לאפליקציה יש שירות שקשור לאפליקציה אחרת שמוצגת. האפליקציה שקשורה לשירות חייבת להישאר גלויה כדי שהאפליקציה ברקע תוכל להתחיל פעילויות בהצלחה.
האפליקציה מקבלת התראה
PendingIntentמהמערכת. במקרה של כוונות בהמתנה לשירותים ולמקלט שידורים, האפליקציה יכולה להתחיל פעילויות למשך כמה שניות אחרי שליחת הכוונה בהמתנה.האפליקציה מקבלת
PendingIntentשנשלח מאפליקציה אחרת שניתן לראות.האפליקציה מקבלת שידור מערכת שבו האפליקציה אמורה להפעיל ממשק משתמש. לדוגמה,
ACTION_NEW_OUTGOING_CALLו-SECRET_CODE_ACTION. האפליקציה יכולה להתחיל פעילויות למשך כמה שניות אחרי שליחת השידור.האפליקציה משויכת למכשיר חומרה נלווה דרך ה-API
CompanionDeviceManager. ה-API הזה מאפשר לאפליקציה להתחיל פעילויות בתגובה לפעולות שהמשתמש מבצע במכשיר מותאם.האפליקציה היא בקר מדיניות מכשיר שפועל במצב בעלי המכשיר. תרחישים לדוגמה לשימוש ב-Device Management API כוללים מכשירים ארגוניים בניהול מלא וגם מכשירים ייעודיים כמו שילוט דיגיטלי וקיוסקים.
המשתמש מעניק לאפליקציה את ההרשאה
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.setPendingIntentBackgroundActivityStartModeActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
מצב קפדני
החל מ-Android 16, מפתח האפליקציה יכול להפעיל מצב קפדני כדי לקבל הודעה כשחסימה של הפעלת פעילות מתרחשת (או כשיש סיכון לחסימה כשה-SDK של יעד האפליקציה מועלה).
קוד לדוגמה להפעלה מוקדמת באפליקציה, בפעילות או ברכיב אחר של האפליקציה, בשיטה Application.onCreate():
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
פרטים נוספים זמינים במאמר בנושא מצב קפדני.