
BootCompletedReceiver שיורשת מ-BroadcastReceiver ומממשת את onReceive. כשהאתחול מסתיים, במקום להפעיל את האקטיביטי מציגים התראה, והאפליקציה תיפתח רק אם המשתמש ילחץ עליה.activityIntent שמצביע על MainActivity.class (עם ה-context של onReceive) ועוטפים אותו ב-PendingIntent.getActivity עם requestCode 0 ודגל FLAG_ONE_SHOT.App is ready, content text בנוסח click to start app, small icon, large icon בעזרת BitmapFactory.decodeResource(context.getResources(), ...), setAutoCancel(true), setContentIntent עם ה-Pending Intent ו-build(). אין כאן Activity, אבל ה-context מספק את אותם כלים.NotificationManagerCompat.from(context).notify(id, notification). ה-id קבוע כי ההתראה מוצגת פעם אחת בלבד.receiver עם intent-filter ו-action של BOOT_COMPLETED, ובנוסף uses-permission של RECEIVE_BOOT_COMPLETED. בלי ההרשאה המכשיר לא ידווח על סיום האתחול.הטקסט המלא של הדקות הראשונות בהרצאה «Notification Invoked from Broadcast Receiver» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בסרטונים הקודמים הצגנו נוטיפיקיישן ברגע שהמשתמש לחץ על לחצן. עשינו את זה רק בכדי לראות מה הקוד שמאפשר להציג נוטיפיקיישן. אבל ברוב המקרים אנחנו נרצה להציג נוטיפיקיישן כתגובה למשהו שהתרחש במערכת או משהו שהתרחש באפליקציה שלנו.
בסרטון הזה אנחנו הולכים לראות בדיוק את זה. איך אנחנו יכולים להציג נוטיפיקיישן כתגובה למשהו שהתרחש במערכת? באחד הסרטונים שראינו כאשר למדנו על Broadcast Receiver, עשינו איזושהי אפליקציה שמקבלת דיווח מהמערכת ברגע שהיה ריסטארט שהסתיים כלומר הסתיים בוט במכשיר
או ברגע שהיוזר הדליק את המכשיר גם אז הבוט הסתיים ואז קיבלנו את הדיווח. באותו סרטון מה שעשינו זה מיידית הצגנו אקטיביטי. אנחנו הולכים לבצע בדיוק את זה אבל במקום להציג אקטיביטי אנחנו הולכים להציג נוטיפיקיישן שמציינת למשתמש שהבוט הסתיים.
אם המשתמש רוצה הוא יפתח את ה-Notification, ילחץ עליה ואז רק נרים לו את האפליקציה שלנו. אז בואו ניזכר איך עושים את זה, איך מקבלים דיווח מהמערכת שה-boot הסתיים.
אנחנו צריכים לבנות Broadcast Receiver, אז בואו ניגש ונייצר לנו איזושהי מחלקה חדשה, נקרא לה Boot Receiver או Boot Completed Receiver, כלומר ה-boot הסתיים, נירש את Broadcast Receiver, נממש את הפונקציה on receive אנחנו יודעים שברגע שהבוט יסתיים אנחנו רוצים אנחנו בעצם הולכים לקבל דיווח על ידי זה שהמערכת תפעיל
את הפונקציה on receive ובפונקציה הזאת אנחנו רוצים להציג נוטיפיקיישן שתצביע לנו על איזשהו אקטיביטי במקרה הזה בוא נניח המיין אקטיביטי ורק אם היוזר ילחץ על הנוטיפיקיישן אז האפליקציה שלנו תופעל.
אז קודם כל יש לנו את המיין אקטיביטי כאן מאחורה שאין בה שום דבר מיוחד, יש לנו את האקטיביטי מיין שיש לנו פה רק איזושהי תווית welcome כזאת ומה שאנחנו רוצים לעשות בבוט קומפליטד זה לבנות אינטנט, נקרא לו אקטיביטי אינטנט שווה ניו אינטנט ואנחנו רוצים שהוא יצביע
לנו על המיין אקטיביטי. אז יש לנו את הקונטקסט שקיבלנו לפונקציה on receive, פרמטר שני שאנחנו רוצים לשלוח יהיה המיין activity נקודה class ואנחנו רוצים לעטוף את האינטנט הזה בפנדינג אינטנט בדיוק כמו שלמדנו איך אנחנו יכולים לשלוח אינטנט לגורם אחר בכדי שהוא יפעיל אקטיביטי הגורם האחר שאנחנו רוצים להעביר לו את
האינטנט זה הנוטיפיקיישן אז יש לנו פה את האובייקט הפנדינג אינטנט בואו נרשום פנדינג אינטנט נקודה get activity אנחנו רוצים לתת לו את הקונטקסט request code חסר משמעות כרגע זה יהיה 0 אין לנו מצבים שונים שאנחנו מפעילים את האקטיביטי הזאת ולכן אנחנו לא צריכים להעביר request code שונים ואנחנו רוצים להעביר את האקטיביטי אינטנט
ואת הדגל pending intent flag one shot זה אומר פעם אחת אנחנו רוצים לפתוח אנחנו לא רוצים לפתוח עוד פעם את ה-activity. אוקיי, לאחר מכן אנחנו כבר יכולים לבנות את ה-notification.
הנה אובייקט ה-notification שלנו. שווה new NotificationCompat.builder ניתן לו את ה-context ונתחיל להשתמש ב-builderDesignPattern בכדי לבנות את אובייקט ה-notification.
SetTickerIsReady שהיוזר יראה למעלה שהאפליקציה שלנו מוכנה. content title גם כן app is ready ויש לנו set content text click to start app set small icon r drawable ויש לנו את האייקון של הטיקר שם set large icon האייקון שיראו על גבי הנוטיפיקיישן
כאשר היוזר פותח אותה ביטמאפ פקטורי די קוד ריסורס קונטקסט נקודה גט ריסורסס. שימו לב שאנחנו לא נמצאים בתוך אקטיביטי, אנחנו נמצאים בתוך בורדקאסט רסיבר, אבל עדיין יש לנו קונטקסט שנותן לנו המון כלים בסיסיים, שאנחנו יכולים דרכם להשיג את כל הדברים שהשגנו עם האקטיביטי.
אז הנה יש לנו פה קונטקסט גט ריסורסס, ומיד אחר כך R, דרואובל ויש לנו את הנוטיפיקיישן קונטנט. אייקון הדבר הבא שאנחנו רוצים set auto cancel true אנחנו רוצים שהנוטיפיקיישן תיעלם ברגע שהיוזר לוחץ עליה ו-set content intent הנה ה-pending intent שלנו פקודה אחרונה build אנחנו רוצים לבנות אחרי שהגדרנו את
כל ההגדרות האלה לבנות את אובייקט הנוטיפיקיישן לאחר מכן אנחנו רוצים Notification Manager Compact.FromContext.Notify ליוזר.
ה-ID חסר משמעות כרגע כי אנחנו רוצים במקרה הזה פעם אחת להציג את ה-Notification כאשר ה-Boot הסתיים ואנחנו לא מעוניינים להציג יותר Notifications ולכן פשוט ניתן ID אחד קבוע ואובייקט ה-Notification שלנו.
פה סיימנו לבנות את הברודקאסט רסיבר. אז הברודקאסט רסיבר, כל מה שהוא עושה כרגע זה יוצר אינטנט שמצביע על המיין אקטיביטי, יוצר נוטיפיקיישן שמסוגל להציג איזושהי הודעה ובלחיצה עליו להפעיל את המיין אקטיביטי ומציג את הנוטיפיקיישן.
כל זה מתבצע כאשר הבוט הסתיים. אוקיי, עכשיו אנחנו רוצים לגשת למניפסט, ולהגדיר במניפסט שאנחנו מעוניינים לקבל את הדיווח של הברודקאסט רסיבר הזה. עשינו את זה על ידי תגית רסיבר שהיה לה את השם של מחלקת ה-boot completed receiver שבנינו.
בתוכה יש לנו intent filter עם האקשן בעל ה-name "boot completed".