יום שלישי, אוקטובר 19

Intents-מבוא להעברת הודעות במערכת

Intent הוא אחד מאבני הבנין החשובות של ה-Android. אני עלול לכתוב קביעות דומות גם לגבי מרכיבים אחרים, אבל בלי להגזים מדי, ה-Intent הוא ממש לב העניין.
באחד הפרקים הקודמים הגדרנו את המושג Intent כאמצעי להעברת הודעות במערכת.
השימושים להם נועד של ה-intent מגוונים:
  • אינטראקציה בין אפליקציות שונות הרצות על המערכת
  • הפעלה של Activities. זהו השימוש הנפוץ, בעזרתו ניתן לקפוץ בין Activities או במילים אחרות לקפוץ בין המסכים\UI.
  • הפצת הודעות Broadcast במערכת. הקליטה ונטיפול בהודעות המופצות נעשה בעזרת class מיוחד לעניין, ה-Broadcast Receiver. עם ה-Broadcast Receiver ניתן לטפל באירועים מיוחדים במערכת כמו סיום ה-Boot, שינויים בשעון, בעיות בסוללה, ואפילו טיפול ב-SMS. כל זה כאמור ע"י ה-Intents שאפשרים פעילות Event Driven. שליחת  Broadcast Intents נעשית ע"י המתודה (sendBroadcast(intent  . נעסוק ב-Broadcast Receiver בפרק נפרד.




הזכרנו קיומם של שני טיפוסי intent עיקריים: מפורש (Explicit), שבו הכתובת של פעילות היעד מצוינת במפורש כחלק מהמתודה שממשת את שליחת ההודעה, ומרומז (Implicit), שם ניתוב ההודעה ליעדה מנוהל ע"י מסנן המערכת - Intent Filter - המחליט על יעד ההודעה לפי פרמטרים המאפיינים אותה, כפי שמפורט להלן.
ה- Intent   מקבל את הפרמטרים הבאים :
  • שם הרכיב אליו ההודעה מיועדת. פרמטר זה לא חייב להיות מוגדר (ראה הגדרת Implicit Explicit כאן למעלה).
  • הפעולה (Action) אותה הוא אמור לבצע. למשל: ACTION_MAIN, שמשמעותה, הפעל את ה-Activity בלי להעביר שום פרמטרים או לצפות לתשובה מהרכיב מקבל ההודעה
  • הנתונים (Data). הנתונים שב- Intent תלויים כמובן בפעולה אותו הוא אמןר לבצע. אם למשל הפעולה היא ACTION_CALL הנתונים שיצורפו יכללו את מספר הטלפון. 
  • קטגוריה. תאור סוג הרכיב שצריך לטפל ב- Intent. ערך לדוגמא, CATEGORY_LAUNCHER. בהנתן קטגוריה זו, הרכיב שמקבל את ההודעה הוא כזה שמתחיל אפליקציה.
  • נתוני אקסטרה. אינפורמציה נוספת שניתן להצמיד להודעה.
ה-Intent Filter מקבל עם ההודעה את 3 השדות (Action, Category, Data). כדי שתהיה התאמה בין Intent ל - Activity צריכה להיות התאמה בשלושת השדות ואז תועבר ההודעה ליעדה. והוא בודק את שלושת השדות. הבדיקות מתבצעות כך:
ה-Action חייב להיות זהה לפחות ל-Action אחד המוגדr ב Filter, אבל אם ה-Intent לא כולל אף Action, הבדיקה תעבור בהצלחה בתנאי שה- Intent Filter מכיל לפחות Action אחד.
הקטגוריה - Category- חייבת להיות זהה לפחות לקטגוריה אחת המוגדרת בפילטר, אבל אם ה- Intent לא כולל אף קטגוריה, הבדיקה תעבור בהצלחה.
הערה לגבי Implicit Intents, המערכת מתיחסת אליהם כאל שיכים לקטגורית DEFAULT, לכן ה- Filter צריך להכיל את הקטגוריה הזו, אלא אם ה-Activity כוללת Action ו - Category מסוג MAIN ו- LAUNCHER בהתאמה. במקרה זה, אין צורך בקיום קטגורית DEFAULT ב- Filter.




נראה מספר דוגמאות. הדוגמא הראשונה, קובץ המניפסט -  שהוצג בפרק קודם. נציג שוב את השורות הרלוונטיות מאותו קובץ:


  1.         <activity android:name=".Hello"
  2.                   android:label="@string/app_name">
  3.             <intent-filter>
  4.                 <action android:name="android.intent.action.MAIN" />
  5.                 <category android:name="android.intent.category.LAUNCHER" 
  6. />
  7.             </intent-filter>
  8.         </activity>


הקטע הנ"ל שייך להגדרת ה-Activity ששמו Hello.
שורות 4 ו-5 מכילות את האינפורמציה שתשמש את ה- Intent Filter: ה-Activity מסוג MAIN מציין
נקודת כניסה ראשית לאפליקציה. MAIN היא Activity שלא נזקק לשום פרמטרים נלווים נוספים. הקטגוריה מסוג LAUNCHER מסמנת שיש להכניס את ה-Activity לרשימה של מפעיל האפליקציות - Application Launcher, כך שבמקרה הנ"ל למשל, הפעלת האפליקציה תגרום להפעלת ה- Hello Activity.
הוספתי שני פוסטים עם דוגמאות המממשות intents :
Explicit Intent
Implicit Intent

2 תגובות: