
ListView. בדרך מוצגים כמה עקרונות נוספים.Tasks ו-ListView בלבד, בלי אפשרות להוסיף מטלה, כי המטלות יגיעו בשידור.BroadcastReceiver וממשת את onReceive.ListView, והיא לא אמורה, כי היא אינה רכיב UI. לכן מגדירים ממשק OnTaskListener עם onTaskAdded ו-onTaskRemoved, שדה listener ופונקציה setOnTaskListener.onReceive קוראים ל-intent.getAction(). אם הוא שווה ל-Action של ההוספה, שולפים את ה-extra עם getStringExtra וקוראים ל-onTaskAdded. אחרת, אם שווה ל-Action של ההסרה, שולפים את ה-extra המתאים וקוראים ל-onTaskRemoved.TasksReceiver, קוראים ל-setOnTaskListener ומגדירים ל-MainActivity לממש את הממשק (Alt-Enter). בונים IntentFilter ומוסיפים שני Actions (הוספה והסרה), ואז registerReceiver(receiver, filter). הרישום בקוד נוח כאן כי צריך את ה-Listener.onTaskAdded מוסיפים את המטלה ל-ArrayList וקוראים ל-notifyDataSetChanged. ב-onTaskRemoved מסירים אותה ומרעננים.הטקסט המלא של הדקות הראשונות בהרצאה «Receive App Broadcast» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בסרטון הקודם ראינו איך אנחנו יכולים לבנות אפליקציה שמדווחת אירוע על ידי Broadcast, על ידי שידור האירוע למערכת ה-Broadcast של אנדרואיד. בסרטון הזה אנחנו הולכים לראות איך אנחנו יכולים לבנות אפליקציה שהיא אחרת, נפרדת לחלוטין, שנרשמת לאירוע הזה ומקבלת אותו.
ותוך כדי נראה עוד כמה עקרונות מעניינים. אז דבר ראשון, יש לנו פה אפליקציה שהיא דומה לקודמת אבל היא אחרת לגמרי. זאת אפליקציה חדשה, זה פרויקט חדש וחובה שהפאקג' יהיה אחר.
הפאקג' הקודם היה com.practic.u במילה אחת. הפאקג' הזה קראתי לו com.practic.u בכדי שיהיה איזשהו שינוי בפאקג'. אם אין שום שינוי בפאקג', אז אי אפשר להתקין את שתי האפליקציות האלה לאותו מכשיר.
ההתקנה השנייה תדרוס את הראשונה. אז קודם כל יש לנו כאן שני פאקג'ים שונים, ולכן שתי אפליקציות שונות לגמרי. עכשיו, מה יש לנו באפליקציה הזאת? יש לנו כאן איזושהי כותרת tasks ויש לנו כאן list view בכדי להציג את כל הtasks, אבל אין לנו שום אפשרות באפליקציה הזאת להוסיף task.
בכוונה לא כתבתי כאן את האפשרות הזאת שהאפליקציה הזאת תוסיף מטלות לרשימה, מפני שזה בדיוק מה שאנחנו רוצים לקבל כדיווח מהאפליקציה הקודמת שבנינו.
מה יש לנו ב-Java Code? יש לנו קודם כל את ה-List View כאן, אנחנו רואים אותו שאמור להציג את כל המטלות. יש לנו כאן את ה-Array Adapter ויש לנו כאן את ה-Array List שמחזיק את המטלות.
בואו את זה נעביר למעלה. אוקיי, עכשיו ב-OnCreate מה שעשינו זה התרנו את ה-List View. יש לנו כאן את האדפטר שמציג את ה-ArrayList שכמובן הוא כרגע ריק לגמרי, עדיין כשאנחנו מריצים את האפליקציה אין לנו מטלות וחיברנו את האדפטר ל-ListView כך שנוכל להציג את התוכן של ה-ArrayList.
זה בעצם מה שיש לנו בקוד. אז מה שאנחנו צריכים לעשות קודם כל בכדי לקבל את הדיווחים זה לגשת ולבנות מחלקה חדשה שהיא מחלקת ה-Broadway, בודקאסט רסיבר שלנו, שתוכל לקבל את הדיווחים.
בואו נקרא לה tasks receiver, נבצע אוקיי, נירש את בודקאסט רסיבר בצורה כזאת, נבצע implement methods, יש לנו פה את המתודה האחת והיחידה on receive, ואנחנו יודעים שברגע שהאירוע ידווח, כלומר מטלה תתווסף באפליקציה האחרת שבנינו, הקודמת, והיא תדווח את זה למערכת הברודקאסט, אנחנו נקבל את זה וה-on-receive הזה יתבצע.
מה אנחנו רוצים לעשות? אנחנו רוצים להוסיף את זה ל-list view של המיין אקטיביטי. אוקיי, אז איך יש לנו גישה ל-list view של המיין אקטיביטי?
אז התשובה היא שאין לנו גישה ל-list view של המיין אקטיביטי, ולא אמורה להיות לנו גישה ל-list view של המיין אקטיביטי, כי אנחנו לא רכיב UI, רכיב האזנה לאירועים של המערכת אבל מה שאנחנו כן יכולים לעשות זה לדווח ל-UI על ידי כל הקונספט של ה-Listener Design Pattern וכך אם ה-UI
יוצר אובייקט שלנו אז הוא יוכל לקבל את הדיווחים אז בואו נעשה את זה ותוך כדי ניזכר מה זה היה ה-Listener Design Pattern אז הפאטרן הזה אומר שיש לנו איזשהו אינטרפייס, נקרא לו onTaskListener ויש לו שתי פונקציות onTaskAdded שמדווחת את ה-added task ו-onTaskRemoved שמדווחת את ה-removed task.
עכשיו אנחנו רוצים לבוא לאזור הגלובלי הזה וליצור אובייקט מהאינטרפייס onTaskListener, נקרא לו Listener. אנחנו רוצים שהמיין אקטיביטי תוכל להירשם אלינו, אז בואו נייצר איזושהי פונקציה שנקראת setOnTaskListener שמקבלת את האינטרפייס ופשוט רושמת אותו לליסנר
הגלובלי. this.listener שווה listener בצורה כזאת. אוקיי, כל מה שנשארנו לעשות זה לממש את פונקציית ה-OwnReceive ואנחנו רוצים לקבל קודם כל את ה-Task ולדווח את זה ל-UI.
אז אנחנו יודעים שכל פעם שיש אירוע הפונקציה OwnReceive מתבצעת. אנחנו רוצים אבל לעשות משהו נוסף כאן, אנחנו רוצים לדעת איזה אירוע התבצע, האם זה Task Added או האם זה Task Removed.
ומה שאנחנו יכולים לעשות זה משהו שעוד לא עשינו בעבר וזה לקחת את הברודקאסט ליסנר הזה ולהירשם איתו לשני האירועים.
זאת אומרת שפעם ראשונה אנחנו רואים שאפשר לבנות איזושהי מחלקה ולרשום אותה לכמה אירועי ברודקאסט שאנחנו רוצים. אז איך עושים את זה? איך יודעים איזה אירוע הפעיל אותנו?
מה שאנחנו צריכים לעשות זה לקחת את האקשן על ידי האינטנט get action וזה מאפשר לנו לדעת בול איזה אירוע הפעיל אותנו. ולעת כל מה שאנחנו צריכים לעשות זה לבדוק האם האקשן equals לאירוע added task או task added איך שקראנו לו.
אז זה היה com.practicu במילה אחת .task underline added אם זה המצב והוא שווה לו אז אנחנו רוצים לשלוף את הטאסק שדווחה אלינו את המטלה שדווחה בואו ניקח כאן AddedTask וניגש ל-intent.getStringExtra AddedTask בצורה כזאת.
אחרי שיש לנו את ה-Task אנחנו רוצים לדווח אותו. אז אנחנו רוצים לעשות קריאה, לקרוא לפונקציה onTaskAdded ולשלוח את ה-AddedTask.
במידה והאקשן שווה ל-com.practicue.task_removed אנחנו רוצים להוציא את ה-removedTask. אנחנו רוצים לשלוף אותה על ידי intent.getStringExtra.removedTask בצורה כזאת ולדווח על ידי listener onTaskRemoved וסיימנו לבנות את המחלקה שמקבלת את הדיווחים.
כל מה שאנחנו רוצים לעשות עכשיו זה להירשם אליה, ובגלל שאנחנו רוצים לקבל דיווחים מהמחלקה הזאת על ידי ה-Listener Design Pattern, אז הדבר הכי נוח לבצע זה להירשם דרך Java Code.
אז בואו נחזור ל-Code ב-Java, וכאן אנחנו רוצים ב-OnCreate לבצע את הרישום הדינמי ל-Broadcast Receiver. אנחנו רוצים לבנות אובייקט מטיפוס, tasks receiver בואו נעשה new tasks receiver הנה האובייקט שלנו לאחר מכן אנחנו רוצים להירשם לאירועים שהוא מדווח אלינו על ידי ה-listener שלו אז יש לנו פה את ה-tasks receiver.set on task listener ולהגיד לו תקשיב
המחלקה שלנו המיין אקטיביטי מממשת את האינטרפייס הזה מה שעדיין לא נכון אז הוא אומר לנו תקשיבו יש לכם פה שגיאה ועדיין לא נכון אז אנחנו יכולים ללחוץ על Alt Enter ולהגיד לו Make Main Activity Implement את ה-Interface on Task Listener אז הוא אומר לנו יש לכם שתי פונקציות שאתם צריכים
לממש אין שום בעיה בואו נממש אותם והנה אנחנו רואים שה-Main Activity בעצם מממשת את ה-Interface on Task ליסנר שמקבלת את הדיווחים מהטאסקס רסיבר והוא יקבל את הדיווחים כמובן מהאפליקציה השנייה ויגיד לנו שאנחנו UI, אנחנו היוזר אינטרפייס.
אז קודם כל יש לנו פה את שתי הפונקציות האלה, זה בסדר, בואו נשלים רגע את הקוד הזה.