התראות מדויקות נועדו להתראות או לפעולות ביוזמת המשתמש יכולה להתרחש בזמן מדויק.
SCHEDULE_EXACT_ALARM
, ההרשאה שהושקה ב-Android 12 לאפליקציות כדי
לתזמן התראות מדויקות, כבר לא מוענקות מראש לרוב האפליקציות החדשות שהותקנו
אפליקציות שמטרגטות ל-Android מגרסה 13 ואילך (הוגדרה כ'נדחתה' כברירת מחדל). אם המשתמש מעביר נתוני אפליקציה למכשיר עם Android 14 באמצעות פעולת גיבוי ושחזור, ההרשאה עדיין תידחה. אם
לאפליקציה קיימת כבר יש את ההרשאה הזו, היא תינתן מראש כשהמכשיר
משתדרגים ל-Android 14.
כדי להפעיל התראות מדויקות נדרשת ההרשאה SCHEDULE_EXACT_ALARM
דרך ממשקי ה-API הבאים או הודעת השגיאה SecurityException
:
השיטות המומלצות הקיימות לשימוש בהרשאה SCHEDULE_EXACT_ALARM
עדיין
חלות, כולל:
- בודקים את ההרשאה באמצעות
canScheduleExactAlarms()
לפני שמתזמנים התראות מדויקות. - הגדרת האפליקציה להאזנה ולתגובה הולמת לשידור בחזית
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
שהמערכת שולחת כשהמשתמש מעניק את ההרשאה.
אפליקציות שהושפעו
אם במכשיר מותקנת מערכת Android מגרסה 14 ואילך, השינוי הזה ישפיע על אפליקציה חדשה שתתקינו עם המאפיינים הבאים:
- מטרגטת ל-Android 13 (רמת API 33) ואילך.
- מצהירה על ההרשאה
SCHEDULE_EXACT_ALARM
במניפסט. - לא עומד בפטור או בתרחיש לפני הענקת התמיכה.
- לא אפליקציית יומן או שעון מעורר.
באפליקציות של יומן ושעון מעורר צריך להצהיר על 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).
תהליך זה זהה לתהליך העבודה הרגיל להגשת בקשת אישור הרשאה:
- אפליקציות צריכות לבצע קריאה ל-
AlarmManager.canScheduleExactAlarms()
כדי לוודא שיש להן את ההרשאה המתאימה. אם לאפליקציה אין את ההרשאה, צריך להפעיל כוונה (intent) שכוללת את הערך
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
, יחד עם שם החבילה של האפליקציה, כדי לבקש מהמשתמשים להעניק את ההרשאה.בודקים את ההחלטה של המשתמש בשיטה
onResume()
באפליקציה.האזנה ל
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
שידורים שנשלחים אם המשתמש מעניק את ההרשאה.אם המשתמש העניק לאפליקציה את ההרשאה, האפליקציה יכולה להגדיר הגדרות מדויקות שעונים מעוררים שהוגדרו. אם המשתמש דחה את ההרשאה, צריך לשנות את חוויית השימוש באפליקציה כך שהיא תספק למשתמש את הפונקציונליות הרצויה בלי המידע שמוגן על ידי ההרשאה הזו.
קטע הקוד הבא מדגים איך לבדוק אם
ההרשאה 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
.
הנחיות בדיקה
כדי לבדוק את השינוי הזה, צריך להשבית את האפשרות התראות ו הרשאה לתזכורות באפליקציה מהדף גישה מיוחדת לאפליקציה בהגדרות המערכת (הגדרות > אפליקציות > גישה מיוחדת לאפליקציה > שעונים מעוררים תזכורות) ולצפות בהתנהגות של האפליקציה.