‏הצגת רשומות עם תוויות intent filter. הצג את כל הרשומות
‏הצגת רשומות עם תוויות intent filter. הצג את כל הרשומות

יום רביעי, אוקטובר 20

כמה מילים על קובץ המניפסט

נתייחס לקובץ ה- AndroidManifest.xml הנמצא בספריה הראשית של הפרויקט. מטרת סקירה זו היא לקבל אוריינטציה שנזדקק לה בהמשך, בפרק הבא הדן ב-intents. קובץ המניפסט כולל אינפורמציה על האפליקציה כגון מיקום קובץ האייקון שישמש להפעלת האפליקציה, ורשימה של ה-Activity וה- Services שקימים בפרויקט ופרמטרים הקשורים אליהם.
סיבת הקיום העיקרית של הקובץ: הכרזה על מרכיבי האפליקציה השונים כך שהאנדרואיד יכיר אותם ויוכל להפעיל אותם.
על המפתח לרשום את הנתונים של כל ה- Activities וה- Services בקובץ המניפסט. אלמנט שלא ירשם בקובץ, האפליקציה כאמור לא תכיר אותו.
לצורך העניין נבחן את הקובץ מפרויקט ה- HelloWorld אותו סקרנו בשיעור הקודם. הנה תוכן הקובץ:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.       package="com.example.hello"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     <application android:icon="@drawable/icon" 
  7. android:label="@string/app_name">
  8.         <activity android:name=".Hello"
  9.                   android:label="@string/app_name">
  10.             <intent-filter>
  11.                 <action android:name="android.intent.action.MAIN" />
  12.                 <category android:name="android.intent.category.LAUNCHER" 
  13. />
  14.             </intent-filter>
  15.         </activity>
  16.     </application>
  17.     <uses-sdk android:minSdkVersion="8" />
  18. </manifest> 
שורות 1-7 כוללות כותרות והגדרות כלליות של הפרויקט כגון שם החבילה (שורה 3), גרסת ושם האפליקציה (שורה 4 ו-5), בשורה 6 מתואר הקובץ שישמש כאייקון להפעלת האפליקציה. במקרה שלנו, מדובר בקובץ icon.png הנמצא בספריית res/draw, ראה התייחסות לנושאי תוכן הספריות בשיעור Hello World.
שורה 8-15 מתארת את הActivity שבמקרה שלנו הוא היחידי בפרויקט. במידה שהיו נוספים Activity או Service נוספים הם היו צריכים להרשם כאן. שורה 8: שם ה Activity, שנתנו כזכור עם בניית הפרויקט. שורה 10-14 מגדירות Intent Filter. הגדרת ה- Intent ניתנה בשיעור קודם שהתייחס להגדרות מושגים. זוהי הודעת מערכת שמנותבת ע"י מסנן (Intent Filter). נרחיב על הנושא באחד הפרקים הבאים.
שורה 18 מציינת את גרסת ה- API המינימלית אליה הפרויקט מסוגל להתאים. שוב, מספר זה נתנו כשבנינו את הפרויקט. ראה שיעור Hello World.

יום שלישי, אוקטובר 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

יום שני, אוקטובר 18

מושגי יסוד של אנדרואיד

מספר מושגי יסוד של האנדרואיד: 
גם אם בקריאה ראשונה ההגדרות עלולות להראות אבסטרקטיות מדי, אין ספק שבהמשך הן תתבהרנה.
  1. Activity
  2. Intent
  3. Service
 Activity - כל תצוגה על ממשק המשתמש (UI = User Interface) היא Activity. האפליקציה יכולה לכלול סדרה של תצוגות, שכל אחת מהן היא היא אקטיביטי בפני עצמה. כל Activity אחראית לשמור את הנתונים הקשורים אליה, כך שאם היא תופסק ותופעל מחדש, התצוגה תשתחזר.  הרחבה על היכולת לשחזר אינפורמציה בפרק שדן ב מחזור חיי האפליקציה.


Intent - זהו המנגנון באמצעותו מועברות הודעות במערכת. בעזרת מנגנון זה ניתן ליצור קשר עם אלמנטים בתוך האפליקציה ומחוצה לה, וכך לבצע פעולות כמו:   מעבר בין מסכי התצוגה שנעשה ע"י שליחת Intent להפעלת  Activity  הרצוי; העברת נתונים בין Activities; גישה לשרותים של מערכת האנדרואיד, למשל שליחת אימייל; יציאת קשר עם שרותים אחרים ע"ע Service כאן בהמשך; גישה למודולים של גורם שלישי הקיימים על הפלטפורמה, העברת הודעות Broadcast במערכת. קיימים שני טיפוסים של Intent - מפורש ומרומז.   ב-Intent מפורש (Explicit) השולח מציין במפורש את שם יעד ההודעה. במקרה של אינטנט מרומז (Implicit) השולח לא מציין את יעד ההודעה, אבל לפי הפרמטרים שבה, ההודעה מכוונת ע"י ה- Intent Filter ליעד המתאים. מנגנון זה מאפשר קוד גמיש בו אין צורך לדעת מראש את זהות היעד של הודעה.
באחד השיעורים הבאים נלמד את המנגנון לעומק.

Service-   פעילות שרצה ברקע, ללא אינטראקציה ישירה עם המשתמש, כלומר בלי UI. ה- Service יכול לקבל פקודות מ-Activities - שהוא כאמור בעל ממשק למשתמש - באמצעות  Intent. ה- Service מתאים לפעילויות רקע כגון נגן, טיימר וכדומה.