ב-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 הזה מאפשר לאפליקציה להתחיל פעילויות בתגובה לפעולות שהמשתמש מבצע במכשיר מותאם.האפליקציה היא בקר מדיניות המכשיר שפועל במצב בעלי המכשיר. תרחישים לדוגמה לשימוש ב-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()
או לשיטות דומות.
By the Creator of the 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());
)
}
פרטים נוספים זמינים במאמר בנושא מצב קפדני.