כברירת מחדל, אי אפשר לתזמן התראות מדויקות

התראות מדויקות נועדו להתראות או לפעולות ביוזמת המשתמש יכולה להתרחש בזמן מדויק.

SCHEDULE_EXACT_ALARM, ההרשאה שהושקה ב-Android 12 לאפליקציות כדי לתזמן התראות מדויקות, כבר לא מוענקות מראש לרוב האפליקציות החדשות שהותקנו אפליקציות שמטרגטות ל-Android מגרסה 13 ואילך (הוגדרה כ'נדחתה' כברירת מחדל). אם המשתמש מעביר נתוני אפליקציה למכשיר עם Android 14 באמצעות פעולת גיבוי ושחזור, ההרשאה עדיין תידחה. אם לאפליקציה קיימת כבר יש את ההרשאה הזו, היא תינתן מראש כשהמכשיר משתדרגים ל-Android 14.

כדי להפעיל התראות מדויקות נדרשת ההרשאה SCHEDULE_EXACT_ALARM דרך ממשקי ה-API הבאים או הודעת השגיאה SecurityException:

השיטות המומלצות הקיימות לשימוש בהרשאה SCHEDULE_EXACT_ALARM עדיין חלות, כולל:

אפליקציות שהושפעו

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

באפליקציות של יומן ושעון מעורר צריך להצהיר על USE_EXACT_ALARM

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

תרחישים לדוגמה שבהם יכול להיות שלא יהיה צורך בהתראות מדויקות

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

ברשימה הבאה מפורטים תהליכי עבודה נפוצים שייתכן שאין בהם צורך בהתראה מדויקת:

תזמון משימות חוזרות במהלך חיי האפליקציה
השיטה set() שימושית אם צריך לקחת בחשבון אילוצים בזמן אמת, כמו הפעלה של המשימה ב-14:00 מחר או בעוד 30 דקות. אם לא, מומלץ להשתמש במקום זאת בשיטות postAtTime() או postDelayed().
עבודות רקע מתוזמנות, כמו עדכון האפליקציה והעלאת יומנים
WorkManager מאפשר תזמון של משימות תקופתיות שחשוב שהן יבוצעו בזמן. אפשר לספק אינטרוולים חוזרים ו-FlexibleInterval (מינימום 15 דקות) כדי להגדיר זמן ריצה מפורט לעבודה.
צריך שהשעון המעורר יפעל בשעה משוערת בזמן שהמערכת במצב חוסר פעילות
להשתמש בהתראה לא מדויקת. באופן ספציפי, צריך להתקשר למספר setAndAllowWhileIdle().
פעולה שהמשתמש מציין שצריכה להתרחש אחרי זמן ספציפי
להשתמש בהתראה לא מדויקת. באופן ספציפי, צריך להתקשר למספר set().
פעולה שהמשתמש ציין שיכולה להתרחש בחלון זמן מסוים
להשתמש בהתראה לא מדויקת. באופן ספציפי, צריך להתקשר למספר setWindow(). שימו לב משך החלון הקטן ביותר המותר הוא 10 דקות.

שלבי ההעברה כדי להמשיך להשתמש בהתראות מדויקות

לכל הפחות, אפליקציות חייבות לבדוק אם יש להן הרשאה לפני תזמון התראות מדויקות. אם לאפליקציות אין את ההרשאה הזו, הן צריכות לבקש אותה מהמשתמש באמצעות הפעלת כוונה (intent).

תהליך זה זהה לתהליך העבודה הרגיל להגשת בקשת אישור הרשאה:

  1. אפליקציות צריכות לבצע קריאה ל-AlarmManager.canScheduleExactAlarms() כדי לוודא שיש להן את ההרשאה המתאימה.
  2. אם לאפליקציה אין את ההרשאה, צריך להפעיל כוונה (intent) שכוללת את הערך ACTION_REQUEST_SCHEDULE_EXACT_ALARM, יחד עם שם החבילה של האפליקציה, כדי לבקש מהמשתמשים להעניק את ההרשאה.

    בודקים את ההחלטה של המשתמש בשיטה onResume() באפליקציה.

  3. האזנה ל AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED שידורים שנשלחים אם המשתמש מעניק את ההרשאה.

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

קטע הקוד הבא מדגים איך לבדוק אם ההרשאה SCHEDULE_EXACT_ALARM:

val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
   // If permission is granted, proceed with scheduling exact alarms.
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // Ask users to go to exact alarm page in system settings.
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

קוד לדוגמה לבדיקת ההרשאה ולטיפול בהחלטות המשתמש onResume():

override fun onResume() {
     
   if (alarmManager.canScheduleExactAlarms()) {
       // Set exact alarms.
       alarmManager.setExact(...)
   }
   else {
       // Permission not yet approved. Display user notice and revert to a fallback  
       // approach.
       alarmManager.setWindow(...)
   }
}

ירידה בחשד לגבי דחיית הרשאות

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

פטורים

לאפליקציות מהסוגים הבאים תמיד יש הרשאה להפעיל את setExact() או setExactAndAllowWhileIdle() אמצעי תשלום:

  • אפליקציות שנחתמו באמצעות אישור הפלטפורמה.
  • אפליקציות שקיבלו הרשאות.
  • אפליקציות שמופיעות ברשימת ההיתרים הרחבה (אם האפליקציה שלכם עומדת בדרישות, תוכלו לבקש זאת באמצעות פעולת הכוונה ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).

מענקים מראש

  • בעלי התפקידים ב-SYSTEM_WELLBEING יקבלו מראש את ההרשאה SCHEDULE_EXACT_ALARM.

הנחיות בדיקה

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