AlarmManager) מאפשרות לבצע פעולות מבוססות-זמן מחוץ לפרק הזמן של האפליקציה.
לדוגמה, אפשר להשתמש בהתראה כדי להפעיל פעולה ממושכת, כמו הפעלה של שירות פעם ביום כדי להוריד תחזית מזג אוויר.
המאפיינים של שעונים מעוררים:
הן מאפשרות לכם להפעיל כוונות בזמנים או במרווחי זמן מוגדרים.
אפשר להשתמש בהם בשילוב עם מקלטי שידורים כדי לתזמן משימות או בקשות עבודה לביצוע פעולות אחרות.
הן פועלות מחוץ לאפליקציה, כך שאפשר להשתמש בהן כדי להפעיל אירועים או פעולות גם כשהאפליקציה לא פועלת, ואפילו אם המכשיר עצמו במצב שינה.
הם עוזרים לכם לצמצם את דרישות המשאבים של האפליקציה. אפשר לתזמן פעולות בלי להסתמך על טיימרים או על שירותים שפועלים באופן רציף.
הגדרת התראה לא מדויקת
כשבאפליקציה מוגדר שעון מעורר לא מדויק, המערכת מפעילה את השעון המעורר בשלב מסוים בעתיד. התראות לא מדויקות מספקות כמה הבטחות לגבי התזמון של שליחת ההתראה, תוך התחשבות בהגבלות של חיסכון בסוללה, כמו מצב שינה.
מפתחים יכולים להשתמש בהבטחות הבאות לגבי ה-API כדי להתאים אישית את התזמון של מסירת התראות לא מדויקות.
הפעלת התראה אחרי זמן מסוים
אם האפליקציה קוראת ל-set(),
setInexactRepeating(),
או ל-setAndAllowWhileIdle(),
ההתראה לא תופעל לפני שעת ההפעלה שצוינה.
ב-Android 12 (רמת API 31) ומעלה, המערכת מפעילה את ההתראה תוך שעה אחת מזמן ההפעלה שצוין, אלא אם חלות הגבלות על חיסכון בסוללה, כמו חיסכון בסוללה או מצב שינה.
הפעלת שעון מעורר במהלך חלון זמן
אם האפליקציה קוראת ל-setWindow(), השעון המעורר לא יפעל לפני זמן ההפעלה שצוין. אלא אם יש הגבלות כלשהן לחיסכון בסוללה, האזעקה מופעלת בחלון הזמן שצוין, החל מזמן ההפעלה שצוין.
אם האפליקציה מכוונת ל-Android 12 או לגרסאות מתקדמות יותר, המערכת יכולה לעכב את ההפעלה של אזעקה לא מדויקת עם חלון זמן של לפחות 10 דקות. לכן, ערכי הפרמטר windowLengthMillis בקטע 600000 נחתכים בדרך כלל ל-600000. יכול להיות שהמערכת תאפשר חלונות קטנים יותר, במיוחד אם ההתראה מתוזמנת להפעלה בעתיד הקרוב.
הפעלת שעון מעורר חוזר במרווחי זמן קבועים בערך
אם האפליקציה קוראת ל-setInexactRepeating(),
המערכת מפעילה כמה שעונים מעוררים:
- ההתראה הראשונה תופעל בחלון הזמן שצוין, החל משעת ההפעלה שצוינה.
- בדרך כלל, אזעקות חוזרות נשמעות אחרי שחלף חלון הזמן שצוין. הזמן בין שני הפעלות רצופות של ההתראה יכול להיות שונה.
הגדרת משימה ברגע מדויק
המערכת מפעילה משימה ברגע מדויק ברגע מדויק בעתיד.
רוב האפליקציות יכולות לתזמן משימות ואירועים באמצעות שעונים מעוררים לא מדויקים כדי להשלים כמה תרחישי שימוש נפוצים. אם הפונקציונליות העיקרית של האפליקציה תלויה בהתראה מדויקת – למשל באפליקציית שעון מעורר או באפליקציית יומן – אפשר להשתמש בהתראה מדויקת במקום זאת.
תרחישים לדוגמה שבהם יכול להיות שלא נדרש שימוש בהתראות מדויקות
הרשימה הבאה מציגה תהליכי עבודה נפוצים שאולי לא מצריכים משימה ברגע מדויק:
- תזמון פעולות שקשורות לזמן במהלך מחזור החיים של האפליקציה
- המחלקות
Handlerכוללות כמה שיטות טובות לטיפול בפעולות שקשורות לתזמון, כמו ביצוע פעולה כל n שניות, בזמן שהאפליקציה פועלת:postAtTime()ו-postDelayed(). חשוב לדעת שממשקי ה-API האלה מסתמכים על זמן הפעולה של המערכת ולא על זמן אמת. - עבודת רקע מתוזמנת, כמו עדכון האפליקציה והעלאת יומנים
WorkManagerמאפשרת לתזמן עבודה תקופתית שרגישה לזמן. אפשר לציין מרווח חזרה וflexInterval(15 דקות לפחות) כדי להגדיר זמן ריצה מפורט לעבודה.- פעולה שמוגדרת על ידי המשתמש וצריכה לקרות אחרי פרק זמן מסוים (גם אם המערכת במצב לא פעיל)
- שימוש בהתראה לא מדויקת. תתקשר אל
setAndAllowWhileIdle(). - פעולה שמוגדרת על ידי המשתמש וצריכה לקרות אחרי פרק זמן מסוים
- שימוש בהתראה לא מדויקת. במיוחד, התקשר אל
set(). - פעולה שהמשתמש מגדיר שיכולה לקרות בחלון זמן מוגדר
- שימוש בהתראה לא מדויקת. תתקשר אל
setWindow(). שימו לב: אם האפליקציה מטרגטת את Android מגרסה 12 ואילך, אורך החלון המינימלי המותר הוא 10 דקות.
דרכים להגדרת משימה ברגע מדויק
האפליקציה יכולה להגדיר התראות מדויקות באחת מהשיטות הבאות. השיטות האלה מסודרות כך שהשיטות שקרובות יותר לתחתית הרשימה מיועדות למשימות שרגישות יותר לזמן, אבל דורשות יותר משאבי מערכת.
setExact()הפעלת שעון מעורר בשעה מדויקת ככל האפשר בעתיד, כל עוד לא מופעלים אמצעים אחרים לחיסכון בסוללה.
משתמשים בשיטה הזו כדי להגדיר התראות מדויקות, אלא אם העבודה של האפליקציה היא קריטית למשתמש מבחינת הזמן.
setExactAndAllowWhileIdle()הפעלת שעון מעורר בשעה כמעט מדויקת בעתיד, גם אם מופעלים אמצעים לחיסכון בסוללה.
setAlarmClock()הפעלת שעון מעורר בשעה מדויקת בעתיד. המשתמשים רואים את ההתראות האלה בבירור, ולכן המערכת אף פעם לא משנה את זמן המסירה שלהן. המערכת מזהה את ההתראות האלה כהתראות הכי חשובות, ויוצאת ממצבי חיסכון בסוללה אם צריך כדי להציג אותן.
צריכת משאבי המערכת
כשהמערכת מפעילה אזעקות מדויקות שהאפליקציה מגדירה, המכשיר צורך הרבה משאבים, כמו חיי סוללה, במיוחד אם הוא במצב חיסכון באנרגיה. בנוסף, המערכת לא יכולה בקלות לאגד את הבקשות האלה כדי להשתמש במשאבים בצורה יעילה יותר.
מומלץ מאוד ליצור שעון מעורר לא מדויק בכל הזדמנות. כדי לבצע עבודה ארוכה יותר, אפשר לתזמן אותה באמצעות WorkManager או JobScheduler מתוך השעון המעורר BroadcastReceiver. כדי לבצע עבודה בזמן שהמכשיר במצב שינה, צריך ליצור התראה לא מדויקת באמצעות setAndAllowWhileIdle() ולהתחיל עבודה מההתראה.
הצהרה על ההרשאה המתאימה למשימה ברגע מדויק
אם האפליקציה שלכם מטרגטת ל-Android מגרסה 12 ואילך, אתם צריכים לקבל הרשאת גישה מיוחדת לאפליקציה מסוג 'התראות ותזכורות'. כדי לעשות זאת, צריך להצהיר על ההרשאה SCHEDULE_EXACT_ALARM בקובץ המניפסט של האפליקציה, כמו שמוצג בקטע הקוד הבא:
<manifest ...> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
אם האפליקציה מטרגטת ל-Android 13 (רמת API 33) ומעלה, יש לך אפשרות להצהיר על ההרשאה SCHEDULE_EXACT_ALARM או על ההרשאה USE_EXACT_ALARM.
<manifest ...> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
הרשאות SCHEDULE_EXACT_ALARM ו-USE_EXACT_ALARM מציינות את אותן יכולות, אבל הן ניתנות בצורה שונה ותומכות בתרחישי שימוש שונים. האפליקציה שלך צריכה להשתמש בהתראות מדויקות ולהצהיר על ההרשאה SCHEDULE_EXACT_ALARM או USE_EXACT_ALARM רק אם פונקציה שגלויה למשתמשים באפליקציה מחייבת פעולות עם תזמון מדויק.
USE_EXACT_ALARM
- הוענקה אוטומטית
- המשתמש לא יכול לבטל את הגישה
- בכפוף למדיניות חדשה של Google Play
- תרחישים מוגבלים לדוגמה
SCHEDULE_EXACT_ALARM
- ניתנה על ידי המשתמש
- מגוון רחב יותר של תרחישי שימוש
- האפליקציות צריכות לוודא שההרשאה לא בוטלה
ההרשאה SCHEDULE_EXACT_ALARM לא ניתנת מראש בהתקנות חדשות של אפליקציות שמטרגטות ל-Android 13 (רמת API 33) ומעלה. אם משתמש מעביר נתוני אפליקציות למכשיר עם Android 14 באמצעות פעולת גיבוי ושחזור, ההרשאה SCHEDULE_EXACT_ALARM תידחה במכשיר החדש. עם זאת, אם לאפליקציה קיימת כבר יש את ההרשאה הזו, היא תינתן מראש כשהמכשיר ישודרג ל-Android 14.
הערה: אם משימה ברגע מדויק מוגדרת באמצעות אובייקט OnAlarmListener, כמו באמצעות API setExact, לא נדרשת הרשאת SCHEDULE_EXACT_ALARM.
שימוש בהרשאה SCHEDULE_EXACT_ALARM
שלא כמו USE_EXACT_ALARM, המשתמש צריך להעניק את ההרשאה SCHEDULE_EXACT_ALARM. גם המשתמש וגם המערכת יכולים לבטל את ההרשאה SCHEDULE_EXACT_ALARM.
כדי לבדוק אם ההרשאה ניתנה לאפליקציה, צריך לקרוא ל-canScheduleExactAlarms() לפני שמנסים להגדיר משימה ברגע מדויק. כשההרשאה SCHEDULE_EXACT_ALARM מבוטלת עבור האפליקציה, האפליקציה מפסיקה לפעול וכל ההתראות המדויקות העתידיות מבוטלות. זה גם אומר שהערך שמוחזר על ידי canScheduleExactAlarms() תקף למשך כל מחזור החיים של האפליקציה.
כשההרשאה SCHEDULE_EXACT_ALARMS ניתנת לאפליקציה, המערכת שולחת לה את השידור ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED. האפליקציה צריכה להטמיע מקלט שידור שמבצע את הפעולות הבאות:
- מאשרים שלאפליקציה עדיין יש גישה מיוחדת. כדי לעשות את זה, מתקשרים למספר
canScheduleExactAlarms(). הבדיקה הזו מגנה על האפליקציה במקרה שבו המשתמש מעניק לאפליקציה את ההרשאה ואז מבטל אותה כמעט מיד לאחר מכן. - הפונקציה מתזמנת מחדש את כל ההתראות המדויקות שהאפליקציה צריכה, בהתאם למצב הנוכחי שלה.
הלוגיקה הזו צריכה להיות דומה למה שהאפליקציה עושה כשהיא מקבלת את השידור
ACTION_BOOT_COMPLETED.
בקשה מהמשתמשים להעניק הרשאה ל-SCHEDULE_EXACT_ALARM
במקרה הצורך, אפשר להפנות את המשתמשים למסך Alarms & reminders בהגדרות המערכת, כמו שמוצג באיור 1. כדי לעשות זאת, פועלים לפי השלבים הבאים:
- בממשק המשתמש של האפליקציה, צריך להסביר למשתמש למה האפליקציה צריכה לתזמן אזעקות מדויקות.
- מפעילים Intent שכולל את פעולת ה-Intent
ACTION_REQUEST_SCHEDULE_EXACT_ALARM.
הגדרת התראה חוזרת
התראות חוזרות מאפשרות למערכת להודיע לאפליקציה שלכם על בסיס לוח זמנים חוזר.
התראה שתוכננה בצורה לא טובה עלולה לגרום להתרוקנות הסוללה ולהעמיס עומס משמעותי על השרתים. לכן, ב-Android מגרסה 4.4 (רמת API 19) ואילך, כל האזעקות החוזרות הן אזעקות לא מדויקות.
מאפיינים של שעון מעורר חוזר:
סוג ההתראה. מידע נוסף זמין במאמר בחירת סוג ההתראה.
זמן ההפעלה. אם שעת ההפעלה שציינתם היא בעבר, ההתראה תופעל מיד.
המרווח של השעון המעורר. לדוגמה, פעם ביום, כל שעה או כל 5 דקות.
כוונה בהמתנה שמופעלת כשההתראה מופעלת. כשמגדירים משימה מתוזמנת שנייה שמשתמשת באותו intent בהמתנה, היא מחליפה את המשימה המתוזמנת המקורית.
כדי לבטל PendingIntent(), מעבירים את FLAG_NO_CREATE אל PendingIntent.getService() כדי לקבל מופע של הכוונה (אם הוא קיים), ואז מעבירים את הכוונה אל AlarmManager.cancel().
Kotlin
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager val pendingIntent = PendingIntent.getService(context, requestId, intent, PendingIntent.FLAG_NO_CREATE) if (pendingIntent != null && alarmManager != null) { alarmManager.cancel(pendingIntent) }
Java
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getService(context, requestId, intent, PendingIntent.FLAG_NO_CREATE); if (pendingIntent != null && alarmManager != null) { alarmManager.cancel(pendingIntent); }
בחירת סוג ההתראה
אחד הדברים הראשונים שצריך לקחת בחשבון כשמשתמשים בהתראה חוזרת הוא מה צריך להיות הסוג שלה.
יש שני סוגים כלליים של שעונים להתראות: 'זמן שחלף בזמן אמת' ו'שעון זמן אמת' (RTC). הזמן שחלף בזמן אמת מתבסס על "הזמן מאז הפעלת המערכת" כנקודת התייחסות, והשעון בזמן אמת מתבסס על זמן UTC (שעון קיר). כלומר, הזמן שחלף בזמן אמת מתאים להגדרת שעון מעורר על סמך הזמן שחלף (לדוגמה, שעון מעורר שמצלצל כל 30 שניות), כי הוא לא מושפע מאזור זמן או מהגדרות מקומיות. סוג השעון בזמן אמת מתאים יותר לשעונים מעוררים שתלויים בשילוב של שפה ואזור הנוכחי.
לשני הסוגים יש גרסה של 'הוצאה ממצב שינה', שאומרת למעבד (CPU) של המכשיר להוציא ממצב שינה אם המסך כבוי. כך מוודאים שהמשימה המתוזמנת תופעל בזמן המתוזמן. האפשרות הזו שימושית אם האפליקציה תלויה בזמן. לדוגמה, אם יש לו חלון זמן מוגבל לביצוע פעולה מסוימת. אם לא משתמשים בגרסת ההוצאה ממצב שינה של סוג ההתראה, כל ההתראות החוזרות יופעלו כשהמכשיר יתעורר בפעם הבאה.
אם אתם רק צריכים שההתראה תופעל במרווח זמן מסוים (לדוגמה, כל חצי שעה), אתם יכולים להשתמש באחד מסוגי הזמן שחלף. בדרך כלל, זו הבחירה הטובה יותר.
אם אתם צריכים שההתראה תופעל בשעה מסוימת ביום, אתם צריכים לבחור אחד מסוגי השעון שמבוססים על שעון זמן אמת. עם זאת, חשוב לזכור שלגישה הזו יש כמה חסרונות. יכול להיות שהאפליקציה לא תתורגם טוב ללוקאלים אחרים, ואם המשתמש ישנה את הגדרת השעה במכשיר, זה עלול לגרום להתנהגות לא צפויה באפליקציה. בנוסף, שימוש בסוג שעון מעורר של שעון זמן אמת לא מתאים להרחבה, כמו שצוין למעלה. מומלץ להשתמש בהתראה מסוג "זמן שעבר בזמן אמת" אם אפשר.
זו רשימת הסוגים:
ELAPSED_REALTIME: מפעיל את ה-pending intent על סמך משך הזמן שעבר מאז שהמכשיר הופעל, אבל לא מוציא את המכשיר ממצב שינה. הזמן שחלף כולל את כל הזמן שבו המכשיר היה במצב שינה.
ELAPSED_REALTIME_WAKEUP: המכשיר מתעורר ומפעיל את intent בהמתנה אחרי שחלף משך הזמן שצוין מאז הפעלת המכשיר.