למאמר הפתיחה בנוגע סביבת הפיתוח של Android לחץ כאן.
אז עד עכשיו עברתי על איך לבנות את הסביבת פיתוח עבור Android, אבל לפני שנתחיל לבנות את האפליקציה הראשונה שלנו כדאי להכיר את מערכת ההפעלה עצמה ואת השכבות ממנה היא בנויה, כמו כל מערכת הפעלה גם Android מחולקת לשכבות:
Hardware:
החומרה משתנה מיצרן ליצרן, בד"כ מדובר על מעבד אפליקטיבי לדוגמה Arm Cortex A9 , רכיב MMU - Management Memory Unit לטיפול במספר תהליכים במקביל, תמיד יהיה שטח אכסון ו Ram על מנת להריץ אפליקציות ואת מערכת ההפעלה.
Kernel:
במקרה של Android בסיס מערכת ההפעלה מבוסס על Kernel של Linux שבעצם נותן לנו אל כל השירותים עבור המערכת ומחבר אותנו לרכיבי החומרה במכשיר, ה Kernel עבר מספר שינויים ע"י גוגל, קודם כל זה לא לינוקס מלא וחלק מהכלים של לינוקס לא נמצאים, נמצאים בו כלים יחודיים עבור Android לדוגמה: Paranoid network-ing , שירות שמפריד לנו את הרשת ומאפשר רק לקבוצות מסויימות לבצע תקשורות כמו Bluetooth או לפתוח Sockets, דוגמה נוספת כלי ה Binder שהוא IPC ( inter process communication) יחודי עבור Android והרשימה עוד ארוכה - לחץ כאן לרשימה המלאה.
Native Libraries:
ספריית ה Api שמקשרת את האפליקציה ל Kernel , מכילה מספר ספריות לודגמה: Webkit שהוא שרת Http פנימי שבעזרתו ניתן לממש אפליקציות ב Html 5, ספריות גרפיות כמו Open GL, ממסד נתונים מסוג SqLite ועוד, בעזרת ספריות אלו ניתן לממש אפליקציות וליצור קשר עם החומרה ב Kernel.
Runtime:
אמרתי כבר של Android כותבים ב Java? זאת השכבה הוירטואלית שיוצרת "חדר נקי" עבור אפליקציות, נותנת לאפליקציה שלנו תאימות , ועבודה עם קבצי Jar שמומרים בזמן ריצה לקבצי Dex בינארים שרצים בסביבה הוירטואלית.
Framework:
בשכבה הזאת רוב האפליקציות כתובות ורוב הזמן מבלים בשכבה הזאת, בעצם מהשכבה הזאת הכל מתחיל ומתגלגל דרך ה Runtime משם לספריות ובסוף ל Kernel.
מספיק עם התאוריה ונעבור לתכלס , קיימות 2 שיטות ליצירת אפליקציות ב Android ,השיטה הראשונה כתיבת אפליקציה ב Native Language של Android כלומר כתיבה ב Java או כתיבת אפליקציה בעזרת Html 5 , ההבדל העיקרי הוא בהרשאות גישה לרכיבים במכשיר, בשיטה הראשונה אנחנו יכולים לגשת לאיזו חומרה שאנחנו רוצים וכמובן גישה לאחסון שעל המכשיר, בשיטה השניה יש הגבלות ולא ניתן לבצע את כל הדברים שהשיטה הראשונה מאפשרת לכן חשוב מאוד לאפיין את אופי האפליקציה וע"פ זה לבחור את השיטה המתאימה.
יצירת פרויקט חדש:
הגדרת שם לפרויקט
בחירת Api מתאים למכשיר (Galaxy s2 במקרה שלי)
הגדרת שם לחבילה של התוכנית - מקביל ל Namespace ב .Net , כלומר כל Class שניצור יהיה חלק מהחבילה הזאת.
לא משנה באיזו שיטה נבחר, הגדרת הפרויקט נעשת באותה שיטה, לאחר סיום התהליך נוצר הפרויקט שמכיל מספר תיקיות ומספר קבצים שנעבור עליהם בקצרה.
AndroidManifest.xml
קובץ הפרויקט שמכיל בתוכו את כל ה Activities , הרשאות , גרסאות וכו'.
תיקיית Res
מכילה את כל ה Resources של התוכנית , תמונות בגרסאות שונות, אנימציות וכו`, בתוך תקייה זו קיימות מספר תיקיות נוספות , סדרת תיקיות Drawable שבה נאחסן את הקבצים הגרפיים שלנו לפי איכות , תיקיית ה Layout שבה מאוחסנים קבצי Xml של ה Gui, תיקיית Values מכילה קבצי ערכים קבועים, במקרה של ריבוי שפות ניתן ליצר קובץ Value עובר כל שפה, יש גם תיקיות שנצטרך להוסיף ידנית כמו Anim שאחראית לכל קבצי האנימציה בתוכנית.
תיקיית Src
מכילה את ה Package שלנו, הקוד Java שלנו נמצא כאן.
תיקיית Assets
מכילה את קבצי Htnl ועובדת מול מנגון ה Webkit.
שיטה ראשונה:
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" /
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
Proxytype_blogActivity.java
package com.proxytype_blog.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Proxytype_blogActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button myv = (Button) findViewById(R.id.button1);
myv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView myc = (TextView) findViewById(R.id.textView1);
myc.setText("hello world");
}
});
}
}
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView
android:id="@+id/WebView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
Proxytype_blogActivity.java
package com.proxytype_blog.demo;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
public class Proxytype_blogActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView myv = (WebView)findViewById(R.id.WebView1);
myv.getSettings().setJavaScriptEnabled(true);
myv.setWebChromeClient(new WebChromeClient());
myv.loadUrl(file:///android_asset/www/index.htm);
}
}
Index.html
<!DOCTYPE html>
<html>
<head>
<script src="script.js"></script>
</head>
<body>
<button onclick="clickme()">Click Me</button>
</body>
</html>
script.js
function clickme()
{
alert('hello world!');
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" /
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
Proxytype_blogActivity.java
package com.proxytype_blog.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Proxytype_blogActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button myv = (Button) findViewById(R.id.button1);
myv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView myc = (TextView) findViewById(R.id.textView1);
myc.setText("hello world");
}
});
}
}
תוצאה סופית:
שיטה שניה:
נוסיף תיקייה ל assets בשם www וניצור קובץ בשם index.htm ו script.js, שימו לב גם בשיטה זו יש התערבות של Java אבל היא מינורית, ה Java קורא לדף הראשון של האפליקציה ומשם היא מתגלגלת.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView
android:id="@+id/WebView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
Proxytype_blogActivity.java
package com.proxytype_blog.demo;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
public class Proxytype_blogActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView myv = (WebView)findViewById(R.id.WebView1);
myv.getSettings().setJavaScriptEnabled(true);
myv.setWebChromeClient(new WebChromeClient());
myv.loadUrl(file:///android_asset/www/index.htm);
}
}
Index.html
<!DOCTYPE html>
<html>
<head>
<script src="script.js"></script>
</head>
<body>
<button onclick="clickme()">Click Me</button>
</body>
</html>
script.js
function clickme()
{
alert('hello world!');
}
תוצאה סופית:
בהצלחה...
מנסיוני יחסית קל לעשות אפליקציות לאנדרואיד. באחד מהפרויקטים האחרונים שעבדתי עליהם עשינו תוכנה לשילוט דיגיטלי עם תמיכה באנדרואיד בלי הרבה קשיים
השבמחק