התראות מדויקות נועדו להתראות או לפעולות ביוזמת המשתמש יכולה להתרחש בזמן מדויק.
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 דקות.
שלבי ההעברה כדי להמשיך להשתמש בהתראות המדויקות
לכל הפחות, אפליקציות חייבות לבדוק אם יש להן הרשאה לפני תזמון התראות מדויקות. אם לאפליקציות אין הרשאה, הן חייבות לבקש אותה מהמשתמש על ידי הפעלת כוונת רכישה.
תהליך זה זהה לתהליך העבודה הרגיל לשליחת בקשה לקבלת הרשאה:
- אפליקציות צריכות להתקשר למספר
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()
אמצעי תשלום:
- אפליקציות שנחתמו באמצעות אישור הפלטפורמה.
- אפליקציות שקיבלו הרשאות.
- אפליקציות שנמצאות ברשימת ההיתרים לאספקת חשמל (אם האפליקציה שלכם עומדת בדרישות,
יכול לבקש זאת באמצעות
פעולת Intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
).
מענקים מראש
- בעלי התפקידים של
SYSTEM_WELLBEING
יקבלו מראשSCHEDULE_EXACT_ALARM
.
הנחיות בדיקה
כדי לבדוק את השינוי הזה, צריך להשבית את האפשרות התראות ו הרשאה לתזכורות באפליקציה מהדף גישה מיוחדת לאפליקציה בהגדרות המערכת (הגדרות > אפליקציות > גישה מיוחדת לאפליקציה > שעונים מעוררים תזכורות) ולצפות בהתנהגות של האפליקציה.