Download presentation
Presentation is loading. Please wait.
1
תכנות ב android אליהו חלסצ'י
2
הקדמה עד כה נחשפנו לטכנולוגית ה J2ME
מעתה נכיר טכנולוגיות נוספות לתכנות בסלולר היום נלמד על android על סדר היום: הרצאה ארכיטקטורת android מעגל החיים של אפליקציה תרגול הקמת תשתית העבודה Hello World דוגמאות מתקדמות
3
רקע Android .incנרכשה ע"י Google ב 2005
מערכת הפעלה מבוססת לינוקס למכשירים סלולריים תכנות אפליקציות באמצעות Java ב 2007 נחשף לציבור רובו קוד פתוח תחת רישיון apache ברבעון הראשון של 2010 מכירות של מערכת ההפעלה android ל smart phones בארה"ב היו במקום השני מכולן, לאחר מעה"פ של black berry המכירות עקפו את המכירות של iphone (הצפי היה 2012)
4
ארכיטקטורת android
5
ארכיטקטורת android הארכיטקטורה מבוססת על Linux Kernel 2.6
מהווה שכבת אבסטרקציה לחומרה מודל התקנים מוכח כאמין ורובסטי מספק: memory management process management networking
6
ארכיטקטורת android ה Native Libraries נכתבו ב ++C \ C
נדבר איתם דרך ממשקי Java מבט כללי: ה surface manager אחראי שכל הגרפיקה מכל תהליך תוצג במקום openGL / SGL: ניתן להשתמש בהאצת חומרה ולשלב D2 ו D3 Media framework: כל codec אפשרי של אודיו או וידאו Webkit: מנוע הדפדפן Web kit בשימוש כרום ספארי אייפון ונוקיה S60
7
ארכיטקטורת android
8
ארכיטקטורת android Dalvik Virtual Machine
ה VM של Android - מותאם לסביבת embedded זיכרון, כוח עיבוד, וחיי סוללה מוגבלים VM הן לרוב בארכיטקטורת stack machines בעוד שה DVM היא register based השיטה השלטת במעבדים רגילים המשמעות היא: יותר קוד כדי לבצע הוראה מהשפה העילית אך פחות הוראות VM כדי לבצע את התוכנית הוכח אמפירית כיותר יעיל ל interpreter
9
ארכיטקטורת android Dalvik Virtual Machine - המשך
באמצעות תוכנית בשם dx מתבצעת המרה לקובצי ה class לקובצי dex (מקביל ל Jar) קובץ dex מהווה byte code עבור ה DVM (dalvik executable) כל מידע כפול מופיע רק פעם אחת גם כשהוא לא מכווץ הוא קטן יותר מקובץ Jar מכווץ
10
ארכיטקטורת android Dalvik Virtual Machine - המשך
ה data structure של קובץ dex בנוי בצורה שמאפשרת שיתוף מידע בין תהליכים שונים זה מתאפשר מכיוון שהמידע לא צמוד לאובייקט אלא מנוהל במקום מרוכז המשמעות של כל מה שתיארנו עד עתה היא שניתן להריץ כמה מופעים של ה VM בו זמנית
11
ארכיטקטורת android Dalvik Virtual Machine - המשך
מנגנון של JIT נמצא בפיתוח יש גרסא ניסיונית החל מ Android 2.0 ביצועים מעולים בגרסא 2.2 החדשה Core Libraries כתובות ב Java דרכם אנו מדברים עם ה Native Libraries
12
ארכיטקטורת android Dalvik Virtual Machine - המשך
עדיין אין מנגנון של JIT (נמצא בפיתוח) יש גרסא ניסיונית ב Android 2.0 Core Libraries כתובות ב Java דרכם אנו מדברים עם ה Native Libraries
13
ארכיטקטורת android ה Application Framework: כתוב כולו ב Java
מבט כללי: Activity manager אחראי לניהול מעגל החיים של אפליקציות Package manager אחראי לניהול האפליקציות המותקנות Content providers מאפשר לכל אפליקציה לשתף מידע עם אפליקציות אחרות
14
ארכיטקטורת android בשכבה העליונה נמצאות כמובן האפליקציות עצמן
בשכבה זו אנו כותבים את האפליקציות שלנו בשפת Java תוך כדי שימוש בתשתית הקיימת
15
ארכיטקטורת android
16
אבני הבניין של אפליקציה
הרכיב הכי בסיסי, בד"כ UI שמתאים למסך אחד שלם Activity מגיב להודעות \ שינויי סטאטוס, יכול להעיר תהליך כלשהו IntentReceiver משימה ללא UI שרצה ברקע Service מאפשר לאפליקציה לשתף מידע עם אפליקציות אחרות ContentProvider
17
מעגל החיים של אפליקציה כל אפליקציה רצה בתוך תהליך משלה
Security, protective memory אפליקציה שמעמיסה על המעבד לא תחסום תהליכים קריטיים אחרים כגון לענות לטלפון מערכת Android אחראית להפעלתם ועצירתם של תהליכים כנדרש להרצתן של אפליקציות יתכן שתהליכים יהרגו (ואח"כ ישוחזרו) על מנת לפנות משאבים לתהליכים אחרים
18
מעגל החיים של אפליקציה דוגמא: נניח שמאפליקציית Home פתחנו Gmail
בחרנו מכתב,הצגנו אותו וראינו בתוכו קישור לחצנו על הקישור והדפדפן נפתח בעמוד כלשהו בעמוד יש קישור למפה שלחצנו עליו האפליקציה של תצוגת המפות נפתחה כעת אנו רוצים לחזור מסכים אחורה...
19
מעגל החיים של אפליקציה Home תחילה קיימים 2 תהליכים:
System process Activity Manager Home Home Home תחילה קיימים 2 תהליכים: ה System Process שמריץ את ה Activity Manager שמנהל את מחסנית ה Activities תהליך שמריץ את ה Home Activity שמאפשרת למשתמש לבחור אפליקציות ולדפדף ביניהן Home
20
מעגל החיים של אפליקציה Home Mail כעת המשתמש מפעיל את אפליקציית gmail
System process Activity Manager Home Home Home S Mail Mail List כעת המשתמש מפעיל את אפליקציית gmail ה State של Home נשמר ב Activity Manager נפתח תהליך Mail חדש ובתוכו ה Activity שמציגה את רשימת המכתבים שכעת נראית על כל המסך Home Mail List
21
מעגל החיים של אפליקציה Home Mail כעת המשתמש בחר מכתב כלשהו
System process Activity Manager Home S Home Home Mail Mail List Message S כעת המשתמש בחר מכתב כלשהו ה State של ה Mail List נשמר מתווספת Activity חדשה לתהליך של Mail שמציגה את תוכן המכתב שכעת נראה על כל המסך Home Mail List Message
22
מעגל החיים של אפליקציה Home Mail Browser כעת המשתמש לחץ על קישור במכתב
System process Activity Manager Home S S Home Home Mail Mail List Message S Browser Browser כעת המשתמש לחץ על קישור במכתב ה State של הMessage נשמר נוצר תהליך חדש למען ה Browser בתוכוActivity של Browser שכעת נראה על כל המסך Home Message
23
מעגל החיים של אפליקציה Home Mail Browser
System process Activity Manager Home S S S Home Home Mail Mail List Message Browser Browser S כעת המשתמש לחץ על קישור לפתיחת מפה ה State של הBrowser נשמר נרצה לפתוח את אפליקציית ה Maps אך אין לנו מקום לעוד תהליך... Home
24
מעגל החיים של אפליקציה Home Mail Browser
System process Activity Manager Home S S S S Home Home Mail Mail List Message Browser לא נהרוג את תהליך Home, כי הוא צריך להיות תמיד זמין למשתמש לצורך דפדוף בין אפליקציות גם את תהליך ה Browser לא נהרוג, כי הוא האחרון ולכן תהליך ה Mail הוא זה שייהרג כדי לפנות מקום Home
25
מעגל החיים של אפליקציה Home Browser Maps
System process Activity Manager Home S S S S Home Home Browser Maps Maps כעת יש מקום לתהליך חדש – ייפתח עבור Maps בתוכו ה Activity של Maps שתיראה על כל המסך Home
26
מעגל החיים של אפליקציה Home Browser Maps
System process Activity Manager Home S S S S Home Home Browser Maps Maps כעת המשתמש לוחץ back כדי לחזור לאפליקציה האחרונה ה Activity של Maps תיסגר ונחזור לראות את ה Browser התהליך היה פעיל אז לא היה צורך לטעון מחדש את ה State של ה Browser Home
27
מעגל החיים של אפליקציה Home Browser Maps Mail
System process Activity Manager Home S S S Home Home Browser Browser Mail Maps Message כעת המשתמש שוב לוחץ back כדי לחזור אפליקציה תהליך Maps ייהרג, כדי לאפשר מקום לתהליך Mail עותק חדש של Message ייפתח הוא יתעדכן ב State שנשמר עבורו ב Activity Manager כעת ה Activity של Browser תיסגר ונראה במסך את ההודעה Home Message
28
מעגל החיים של אפליקציה Home Browser Mail
System process Activity Manager Home S S Home Home Browser Mail Mail List Message כעת המשתמש שוב לוחץ back כדי לחזור אחורה תתווסף Activity חדשה של Mail List ה State שלה יתעדכן מה Activity Manager כעת ה Message תיסגר ונראה את רשימת המכתבים במסך Home Mail List Message
29
הקמת תשתית עבודה נוריד את ה Android SDK מהכתובת נחלץ את ה zip לתיקייה כלשהי אפשרי להכניס את תת התיקייה tools לתוך ה Path ניצור workspace חדש ל eclipse בשביל android דרך התפריט help נוסיף את ה plug-in מהכתובת
30
הקמת תשתית עבודה בינתיים נתקין את ה SDK ע"י הפעלת SDK Setup.exe
אם תהיה לו בעיה לגשת ל repository של google נכנס ל settings ונסמן את Force נסגור ונתקין שוב נאשר הכל ונמתין עד סיום ההתקנה תהליך זה קצת ארוך
31
הקמת תשתית עבודה בינתיים נתקין את ה SDK ע"י הפעלת SDK Setup.exe
אם תהיה לו בעיה לגשת ל repository של google נכנס ל settings ונסמן את Force נסגור ונתקין שוב נאשר הכל ונמתין עד סיום ההתקנה תהליך זה קצת ארוך
32
הקמת תשתית עבודה לאחר סיום התקנת ה plug-in ה eclipse יופעל מחדש, כעת נמתין שתסתיים גם התקנת ה SDK נכנס לתפריט windows preferences… תחת Android נבחר את התיקייה בה חילצנו קודם את ה zip שהורדנו (ה SDK של Android)
33
הקמת תשתית עבודה כדי שנוכל לעבוד עם אמולטור עלינו ליצור Android Virtual Device (AVD) = מכשיר נייד מתוך סרגל הכלים של eclipse נלחץ על הכפתור של android ייפתח לנו חלון ה AVD manager נבחר Virtual Devices נלחץ על new… בחלון שייפתח נגדיר מכשיר נייד כרצוננו
34
הקמת תשתית עבודה
35
הקמת תשתית עבודה נוודא שהוא עובד ע"י סימונו ולחיצה על Start
36
Hello world ניצור פרויקט חדש ע"י file new project…
נבחר Android project נמלא לאחר מכן את הפרטים הבאים: שם הפרויקט HelloAndroid Build target = android 1.1 שם האפליקציה Hello, Android נבחר שם ל package כרצוננו נבחר ליצור activity בשם HelloAndroid Min SDK version = 2
37
Hello world נוצרה לנו התוכנית הבאה:
המחלקה Activity היא הישות הבסיסית להרצת פעולות באפליקציה. אפליקציה יכולה להיות מורכבת מכמה Activities אך המשתמש יכול לבצע אינטראקציה רק עם אחת בכל פעם. package biu89697.example; import android.app.Activity; import android.os.Bundle; public class HelloAndroid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } כשה Activity תופעל ע"י Android המתודה (onCreate( תיקרא. היא תשמש אותנו לאתחול כללי ובד"כ גם לאתחול ה UI.
38
Hello world כעת נוסיף לנו UI פשוט: כשנריץ נתבקש לבחור מכשיר
נבחר ב my_avd התוצאה: package biu89697.example; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloAndroid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello, Android"); setContentView(tv); }
39
Hello world כתיבת UI באופן ישיר דרך הקוד
תוביל לכך ששינוי קטן ב layout יגרום לכאב ראש גדול קל לשכוח לחבר views יחד, ויגרמו טעויות ל layout זמן debug... לכן ניתן ליצור UI גם באמצעות קובצי XML נתבונן בקבצים הנוספים שה plug-in יצר main.xml – מגדיר את ה UI strings.xml – כל המחרוזות הקבועות R.java – קיצור ל Resource
40
Hello world main.xml מגדיר לנו את אופן פריסת הרכיבים הגרפים (layout)
וכן את הרכיבים עצמם ניתן לערוך אותו ידנית או באמצעות עורך ויזואלי <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
41
Hello world main.xml עורך ויזואלי
42
Hello world strings.xml כאן נגדיר את כל המחרוזות הקבועות שלנו ב UI
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, HelloAndroid!</string> <string name="app_name">Hello, Android</string> </resources>
43
Hello world כדי שהתוכנית שלנו תשתמש בהגדרות הללו, נחזיר את השורה
במקום tv - ה textView שיצרנו דרך הקוד מתבצעת קריאה סטטית למחלקה R שתפעיל את ה layout שמוגדר ב main.xml תפקיד המחלקה – גישה מהירה ל resources נוצרת אוטומטית עם כל resource שאנו מכניסים אין לערוך את המחלקה הזו ידנית (!) setContentView(R.layout.main);
44
Hello world R.java גישה סטטית לכל משאב לצורך נוחות
public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; public static final class layout { public static final int main=0x7f030000; public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000;
46
דוגמאות מתקדמות אפליקציה שמראה לנו נראה דוגמאות ל תוך כדי תנועה על מפה
כמה קרובים אנו לכתובות החברים שלנו נראה דוגמאות ל הוספה פריט לתפריט שימוש במידע GPS שימוש במידע משותף Intent / Intent Receiver קריאה ל map ביצוע התקשרות מקור:
47
הוספת תפריט onCreateOptionsMenu כשתיבחר אופציה
/* Creates the menu items */ public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_NEW_GAME, 0, "New Game"); menu.add(0, MENU_QUIT, 0, "Quit"); return true; } /* Handles item selections */ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_NEW_GAME: newGame(); case MENU_QUIT: quit(); return false; onCreateOptionsMenu נקראת כאשר מוצר תפריט עלינו לדרוס אותה manu.add מוסיפה פריט כשתיבחר אופציה onOptionsItemSelected תופעל נזהה את האופציה לפי int item.getItemId() לפרטים נוספים:
48
- Location Based Service GPS
ה location based services של android מספקים לאפליקציות הקשר גיאוגרפי דרך location providers כגון GPS android מגיע עם provider בשם ‘gps’ לצורכי פיתוח הוא ממפה את סאן-פרנסיסקו, ניתן ליצור עוד ע"י XML LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); Location location = locationManager.getCurrentLocation("gps");
49
שימוש במידע משותף Cursor c = getContentResolver().query(People.CONTENT_URI, null, null, null, null); startManagingCursor(c); int coordIdx = c.getColumnIndex(People.NOTES); int phoneIdx = c.getColumnIndex(People.PhonesColumns.NUMBER); int nameIdx = c.getColumnIndex(People.NAME); List listItems = new ArrayList(); c.first(); do { String name = c.getString(nameIdx); String coords = c.getString(coordIdx); String phone = c.getString(phoneIdx); //... [ Process the lat/long from the coordinates ] ... //... [ Storing their location under variable loc ] ... String distStr = String.valueOf(location.distanceTo(loc)/1000); name = name + " (" + distStr + "km)"; listItems.add(name); numbers.add("tel:" + phone); } while(c.next()); ContentResolver יכול לשלוח שאילתא למידע משותף של Content Providers נקבל חזרה cursor המצביע על תחילת התשובה שחזרה נשתמש ב People לרשימת החברים
50
Intent / Intent Receiver
המקבילים ל Event / Event handler ניזום Intent חדש בכל פעם שהמכשיר יזוז... ניצור מחלקה פנימית שתתפוס את ה Intent נקשר את השניים ב onCreate() או תחת תפריט כגון start / stop List providers = locationManager.getProviders(); LocationProvider provider = providers.get(0); Intent intent = new Intent(LOCATION_CHANGED); locationManager.requestUpdates(provider, minTime, minDistance, intent); public class myIntentReceiver extends IntentReceiver { @Override public void onReceiveIntent(Context context, Intent intent){ updateList(); } filter = new IntentFilter(LOCATION_CHANGED); receiver = new myIntentReceiver(); registerReceiver(receiver, filter);
51
קריאה ל map נצטרך להרחיב את MapActivity כדי להשתמש ב MapView
למופע של MapView יש מופע של MapController באמצעותו ניתן לשלוט על המפה למשל למרכז אותה מסביב לנק' שלנו באמצעות overlayController נצייר על ה canvas של המפה public class MyMapViewActivity extends MapActivity{ Point point = new Point(lat.intValue(), lng.intValue()); mapController.centerMapTo(point, false); protected class MyLocationOverlay extends Overlay { @Override public void draw(Canvas canvas, PixelCalculator calculator, boolean shadow) { //... [ draw things here ] ... }
52
ביצוע התקשרות נרצה אולי להתקשר לחבר על המפה
ה activity של ההתקשרות מאזינה ל intent מסוג DIAL_ACTION ניזום אותה כך: Intent i = new Intent(); i.setAction(DIAL_ACTION); i.setData(new ContentURI(numbers.get(position))); startActivity(i);
53
הטמעה מנה 3 הבדלים בין JVM סטנדארטי ל DVM
כיצד מתמודד android עם מעבד חלש שיכול להריץ רק מספר קטן של תהליכים במקביל? (קטן יחסית ל PC) מהם Intents / Intent Receivers ? למה עדיף שה layout של ה UI יוגדר מחוץ לקוד ע"י XML? תבקרו בבלוג של android – developer ללמוד עוד תוכלו לראות גם אפשרויות שלא קימות ב J2ME כגון הוספת widgets ישירות למסך הראשי
54
תודה רבה על ההקשבה מקורות: http://developer.android.com/index.html
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.