Android Tutorial – Android Project Structure – Android Application Component – Activity Life Cycle

คราวนี้เรามาดูโครงสร้าง และองค์ประกอบต่างๆของเจ้า Android รวมถึงวงจรชีวิตของเจ้า Activity (ว่าแต่เจ้า Activity มันคืออะไรหว่า…..แหม….ดูเหมือนละครชีวิตยังไงไม่รู้ เอาง่ายๆ แล้วกันนะครับ ก็อาจจะเปรียบได้กับหน้าจอการทำงานหนึ่งๆ นั่นเอง) ว่าแล้วมาต่อกันเลยนะครับ

Android Project Structure

ในการสร้าง Android Project ทุกครั้งจะมีโครงสร้างพื้นฐานของตัวโปรเจ็กต์ ดังนี้

1. scr (Source code) เป็นส่วนของซอสโค้ดที่เราสร้างขึ้นและเขียนขึ้นเป็นไฟล์ .java ซี่งจะเห็นชื่อคลาส แอตทริบิวส์ และเมธอด
2. gen (Generated Java Files) เป็นส่วนที่ถูกสร้างขึ้นโดยอัตโนมัติ เช่น ไฟล์ R.java ซึ่งภายในประกอบด้วย text และ UI Element โดยถูกนำเข้ามาในโปรเจ็คต์ผ่าน Android Plugin ซึ่งไฟล์นี้จะเป็นเหมือน pointer ไปยัง drawable , layout, values directories
3. res (Resource) จะเป็นส่วนของการแสดงผล ของไฟล์อื่นๆ ที่นำมาเป็นส่วนประกอบ ร่วมกับโค้ดที่เราเขียนขึ้น โดยแอนดรอยด์จะมีการแบ่งโฟลเดอร์ ไว้ตามชนิดของ resource นั้น โดยตอนที่เราสร้างโปรเจ็คต์ขึ้นมาใหม่ จะ directory ย่อยๆ อีก 5 directory คือ
– drawable-hdpi/drawable-ldpi/drawable-mdpi สำหรับเก็บภาพ
– layout จัดวาง View ต่างๆ
– values จัดการค่าต่างๆ ที่นำไปใช้ในแอพพลิเคชัน ทั้งนี้ ก็ยังสามารถสร้าง directory ต่างๆ ขึ้นเองเพื่อเก็บข้อมูลอื่นๆ ที่จะใช้ในแอพพลิเคชันได้ด้วย
4. AndroidManifest.xml เป็นโครงสร้างของ xml ไฟล์ ซึ่ง ใน xml นั้นจะเป็นการกำหนดคุณสมบัติ และการตั้งค่าต่างๆต่างๆ ของ แอพพลิเคชั่น เช่น ชื่อของแอพพลิเคชั่น, เวอร์ชั่นของโค้ด, การกำหนดสิทธิ์ ต่างๆ ในการเข้าถึงของแอพพลิเคชั่น และอื่นๆ

Android Application Components

องค์ประกอบของแอนดรอยด์แอพพลิเคชันมีอยู่ 4 ประเภท ดังนี้

1. Activity (User Interface) คือ สิ่งที่ใช้ในการแสดงผล ออกมาเพื่อให้ผู้ใช้งานได้เห็น และได้ใช้งาน โดยในแต่ละ Application นั้น อาจจะมี activity เดียว หรือ หลายๆ activity ก็ได้ หรืออาจะไม่มี Activity เลยก็ได้ และสิ่งที่อยู่ใน activity นั้นจะเรียกว่า view ซึ่งก็มีอยู่ในหลายรูปแบบ เช่น buttons, text fields, scroll bars, menu items, check boxes และอื่นๆ
2. Service (Service Provider) คือ สิ่งที่ไม่มีส่วนของการแสดงผล แต่ถูกเรียกว่ารันอยู่ในลักษณะของ background process โดย service นั้นอาจจะมีการกระทำอะไรบางอย่าง เช่น ติดต่อรับส่งข้อมูลผ่านเครือข่าย หรือคำนวณค่าต่างๆ แล้วก็ทำการส่งผลลัพธ์นั้นไปแสดงยัง activity ก็ได้
3. Broadcast receiver (Data Provider) คือ ตัวที่ใช้สำหรับคอยรับ และตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดขึ้น เช่น เมื่อแบตเตอรี่ต่ำ, ผู้ใช้ทำการเปลี่ยนภาษา, มีการโทรออก, มีข้อความเข้า และอื่นๆ ถึงแม้ broadcast receiver จะไม่มีส่วนของการแสดงผล แต่มันก็สามารถที่จะเรียก activity ขึ้นมาแสดงผลให้ผู้ใช้ได้ หรืออาจจะใช้สิ่งที่เรียกว่า Notification Manager ซึ่งจะเป็นตัวที่แจ้งเตือนในรูปแบบของ การสั่น, การแสดงไฟกระพริบที่หน้าจอ หรือการส่งเสียงออกมา โดยจะมี icon แสดงอยู่บน status bar เพื่อให้ผู้ใช้กดเข้าไปเปิดดูเหตุการณ์ที่เกิดขึ้น
4. Content provider (System Event Listener) คือกลุ่มของข้อมูลที่สร้างขึ้นจากแอพพลิเคชั่น เพื่อให้แอพพลิเคชั่นอื่นๆ ได้นำไปใช้ โดยการจัดเก็บข้อมูลของ content provider นั้นจะอยู่ในลักษณะของ ไฟล์, ฐานข้อมูล SQLite และอื่นๆ โดยการจัดเก็บข้อมูลของ content provider นั้นจะอยู่ในลักษณะของ ไฟล์, ฐานข้อมูล SQLite และอื่นๆ ตัวอย่าง Application ที่ใช้งาน Content Provider ที่เห็นชัดเจนที่สุดคือโปรแกรม Contacts ที่แสดงรายชื่อใน Contacts ของเรานั่นเอง

Activity Life Cycle

Activity มีหน้าที่ในการสร้าง และควบคุมการทำงานของหน้าจอ เพื่อโต้ตอบกับผู้ใช้งาน ซึ่งจะมีได้แค่ Activity เดียวเท่านั้นที่โต้ตอบกับผู้ใช้งานในขณะใดขณะหนึ่ง Activity แต่ละตัวจะมีวงจรชีวิตเป็นของตนเอง โดยแบ่งเป็นสถานะดังนี้

– Running เป็นสถานะที่ Activity กำลังได้ทำงานในขณะนั้น
– Pause เป็นสถานะที่ Activity ปรากฏอยู่บนหน้าจอ แต่ไม่ได้ทำงานในขณะนั้น
– Stop เป็นสถานะที่ Activity ไม่ปรากฏบนหน้าจอ
– Kill เป็นสถานะที่ Activity ถูกทำลายไปแล้วเมื่อ Activity อยู่ในสถานะ Pause หรือ Stop Activity สามารถถูกทำลายได้โดยระบบ

onCreate(Bundle) – จะถูกเรียกเมื่อ Activity มีการสร้างตัวเองครั้งแรก เป็น method สำคัญในสร้างหน้าจอการทำงานต่างๆ หรือกำหนดสถานะต่างๆ ของ control ที่จะใช้งาน
onRestart() – จะถูกเรียกหลังจากที่ Activity กลับมาจากสถานะ Stop เพื่อเริ่มทำงานใหม่อีกครั้ง
onStart() – จะถูกเรียกเมื่อ Activity เริ่มแสดงให้ผู้ใช้งานเห็น
onResume() – จะถูกเรียกเมื่อ Activity สามารถที่จะโต้ต้อบกับผู้ใช้งานได้
onPause() – จะถูกเรียกเมื่อมี Activity อื่นกำลังทำงาน เป็น method สำคัญในการเก็บข้อมูลที่สำคัญ หรือทำการปล่อยหน่วยความจำเพื่อให้ Activity อื่นได้ใช้งาน
onStop() – จะถูกเรียกเมื่อ Activity ไม่ปรากฏบนหน้าจอ แล้วจะเข้าสู่สถานะ Stop
onDestroy() – จะถูกเรียกเมื่อ Activity กำลังจะถูกทำลาย

และยังมี method ทีสำคัญอีก 2 ตัว คือ
onSaveInstanceState(Bundle) – จะถูกเรียกก่อน onPause() เพื่อเก็บสถานะต่างๆ ของ Activity ไว้ใช้เมื่อ Activity นี่ได้กลับมาทำงานอีกครั้ง
onRestoreInstanceState(Bundle) – จะถูกเรียกก่อน onResume() เพื่อนำสถานะต่างๆ ของ Activity ที่เก็บไว้มาใช้งาน

ตัวอย่าง Project ทดสอบ Activity Life Cycle

โดยจะเป็นการทดสอบให้เห็นภาพการทำงาน Activity Life Cycle จากการทำงานของ Activity กับ Dialog และ Activity กับ Activity โดยจะแสดงเป็นข้อความ (Toast) บอก ถึงการเรียกใช้เมธอดต่างๆ ของคลาส Activity ว่าจะถูกเรียกให้ทำงานเมื่อใด แล้วต้องบอกว่านี่สำคัญมากๆเลย ลองพยายามสังเกตุการทำงานดูนะขอรับ…. ไม่ยาก ดูให้เข้าใจนะครับแล้วจะทำให้นำไปต่อยอดในการสร้างแอพฯได้แยะเลย…

1. สร้างโปรเจ็ค Android Project โดยไปที่เมนู File > New > Project > Android Project หรือ File > New > Android Project ( กรณีมี เมนู Android Project ให้เลือก )

2. กำหนดค่าต่างๆ แล้วคลิกปุ่ม Finish

3. ที่ layout > main.xml แก้ไข ดังนี้

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Dialog Activity" android:id="@+id/btnDialog" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Full Screen Activity" android:id="@+id/btnFull" /> </LinearLayout>

4. ที่ layout คลิกขวา New > Android XML File ช่อง File กำหนด second.xml และแก้ไข ดังนี้

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:layout_gravity="center" android:text="This is a second activity" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Close" android:onClick="finishActivity" /> </LinearLayout> </LinearLayout>

5. ที่ src คลิกขาว New > Class ช่อง Name กำหนด FullActivity และแก้ไข ดังนี้

public class FullActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.second); } public void finishActivity(View v) { finish(); } }

6. ที่ AndroidManifest.xml เพิ่มโค้ดต่อไปนี้

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sau.csbc" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".DialogActivity" android:theme="@style/Theme.TransparentTest" /> <activity android:name=".FullActivity" /> </application> <uses-sdk android:minSdkVersion="7" /> </manifest>

7. ที่ src > com.androidjump.app.tutor > MainActivity.java แก้ไข ดังนี้

public class MainActivity extends Activity { /** Called when the activity is first created. */ private Button btnFull; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnFull = (Button) findViewById(R.id.btnFull); btnFull.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), FullActivity.class); startActivity(intent); } }); Toast.makeText(getApplicationContext(), "onCreate…", Toast.LENGTH_SHORT).show(); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Toast.makeText(getApplicationContext(), "onRestart…", Toast.LENGTH_SHORT).show(); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Toast.makeText(getApplicationContext(), "onStart…", Toast.LENGTH_SHORT).show(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Toast.makeText(getApplicationContext(), "onResume…", Toast.LENGTH_SHORT).show(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Toast.makeText(getApplicationContext(), "onPause…", Toast.LENGTH_SHORT).show(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Toast.makeText(getApplicationContext(), "onStop…", Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Toast.makeText(getApplicationContext(), "onDestroy…", Toast.LENGTH_SHORT).show(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); Toast.makeText(getApplicationContext(), "onRestoreInstanceState…", Toast.LENGTH_SHORT).show(); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); Toast.makeText(getApplicationContext(), "onSaveInstanceState…", Toast.LENGTH_SHORT).show(); } }

8. ที่ AndroidLifeCycleProject คลิกขวา Run As > Android Application สังเกตุผลการทำงาน โดยจะเห็นการเรียกใช้งานเมธอดต่างๆ ว่าจะถูกทำงานเมื่อใด ซึ่งถือเป็น Life Cycle ของการทำงานของ Activity หนึ่งๆ ย้ำว่าสังเกตุการทำงานที่เกิดขึ้น และการเรียกใช้เมธอดต่างๆ ให้ดีนะครับผม

 

credit : http://www.androidjump.com/วงจรชีวิต-android-activity-life-cycle/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s