הגבלות על התחלת פעילויות מהרקע

ב-Android 10 (רמת API 29) ומעלה יש הגבלות על המועד שבו אפליקציות יכולות להתחיל פעילויות כשהאפליקציה פועלת ברקע. ההגבלות האלה עוזרות לצמצם את ההפרעות למשתמשים ולאפשר להם לשלוט יותר במה שמוצג במסך שלהם.

במדריך הזה מוצגות התראות כחלופה להפעלת פעילויות מהרקע. בנוסף, מפורטים המקרים הספציפיים שבהם ההגבלה לא חלה.

הצגת התראות במקום זאת

בכמעט כל המקרים, אפליקציות שפועלות ברקע צריכות להציג התראות שקשורות לזמן כדי לספק למשתמש מידע דחוף, במקום להתחיל פעילות באופן ישיר. ההתראות האלה כוללות טיפול בשיחה טלפונית נכנסת או בשעון מעורר פעיל.

למערכת ההתראות והתזכורות הזו יש כמה יתרונות למשתמשים:

  • במהלך השימוש במכשיר, המשתמש יראה התראה קופצת שתאפשר לו להגיב. המשתמש שומר על ההקשר הנוכחי שלו ויש לו שליטה על התוכן שמוצג במסך.
  • התראות שדורשות תגובה מיידית פועלות בהתאם לכללים של מצב נא לא להפריע שהמשתמש הגדיר. לדוגמה, המשתמשים יכולים לאפשר שיחות רק מאנשי קשר ספציפיים או ממתקשרים חוזרים כשהמצב 'נא לא להפריע' מופעל.
  • כשהמסך של המכשיר כבוי, ה-Intent במסך מלא מופעל באופן מיידי.
  • במסך ההגדרות של המכשיר, המשתמש יכול לראות אילו אפליקציות שלחו התראות לאחרונה, כולל התראות מערוצים ספציפיים. במסך הזה, המשתמש יכול לשלוט בהעדפות ההתראות שלו.

מתי אפשר להתחיל פעילויות באפליקציות

אפליקציות שפועלות ב-Android 10 ומעלה יכולות להתחיל פעילויות כשמתקיים אחד או יותר מהתנאים הבאים:

  • לאפליקציה יש חלון גלוי, כמו פעילות בחזית.
  • לאפליקציה יש פעילות במחסנית האחורית של המשימה בחזית.
  • האפליקציה כוללת פעילות במחסנית האחורית של משימה קיימת במסך האפליקציות האחרונות.

  • באפליקציה יש פעילות שהתחילה לאחרונה.

  • האפליקציה finish() נקראה בפעילות לפני זמן קצר מאוד. ההגדרה הזו רלוונטית רק אם לאפליקציה הייתה פעילות בחזית או פעילות במחסנית האחורית של המשימה בחזית בזמן הקריאה ל-finish().

  • האפליקציה כוללת אחד מהשירותים הבאים שקשורים למערכת. יכול להיות שיהיה צורך להפעיל ממשק משתמש בשירותים האלה.

  • לאפליקציה יש שירות שקשור לאפליקציה אחרת שמוצגת. האפליקציה שקשורה לשירות חייבת להישאר גלויה כדי שהאפליקציה ברקע תוכל להתחיל פעילויות בהצלחה.

  • האפליקציה מקבלת התראה 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.

טבלת כוונות בהמתנה
תרשים 1: תהליך קבלת ההחלטות לגבי הפעלת פעילות ברקע.

לפי השולח של 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() או לשיטות דומות.

פרטים נוספים זמינים במאמרי העזרה הרלוונטיים:

מצב קפדני

החל מ-Android 16, מפתח האפליקציה יכול להפעיל מצב קפדני כדי לקבל הודעה כשפעילות מופעלת נחסמת (או שיש סיכון שהיא תיחסם כשמגדילים את יעד ה-SDK של האפליקציה).

קוד לדוגמה להפעלה מוקדמת באפליקציה, בפעילות או ברכיב אחר של האפליקציה בשיטה Application.onCreate():

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

פרטים נוספים זמינים במאמר בנושא מצב קפדני.