Pages

12/11/2013

Android Acitivity Lifecycle ???

มารู้จักรอบชีวิตของ Android กัน มันไม่เหมือนใครหรอกนะ

หลังจากเขียนบทความเรื่อง Hello World with Android แล้วก็เลยมานั่งคิดว่า ควรจะเขียนเรื่องอะไรต่อดี คิดไปคิดมาเลยว่า เราน่าจะเขียนเรื่อง Android Activity Lifecycle นะ ซึ่งมันคืออะไร เดี๋ยวอธิบายให้ฟัง
ส่วนทําไมหรอ เพราะว่าการจะเริ่มเขียน Application นึงแบบจริงๆจัง มันจะต้องรู้จักของที่เราจะทําขึ้นมาให้ดีซะก่อน การที่เราเรียน Lifecycle ของ Android แล้ว จะทําให้เราเขียน Android ได้ดีมากขึ้นเยอะเลย

อะไรคือ Android Acitivity Lifecycle ???

Activity Lifecycle คือ วงจรชีวิตของ Activity ในโปรแกรมของเรานั่นเอง เผื่อคนไม่รู้ Activity คือ ส่วนแสดงผลของโปรแกรมเรานั่นเอง เพราะฉะนั้นคําว่าวงจรชีวิตของ Activity หมายถึง การเกิดขึ้น-ตั้งอยู่-ดับไป นั่นเองเพราะฉะนั้น สมมุติว่าเราเข้าใจการ เกิดขึ้น-ตั้งอยู่-ดับไป เราก็จะสามารถจัดการกับ resource ต่างๆของ Application ได้ดีขึ้น เราจะรู้ว่า จังหวะไหน เราต้องถอย จังหวะไหน เราต้องบุก เราต้องทําอะไรในจังหวะไหน นี่ค่อนข้างสําคัญมากน่ะ
เดี๋ยวจะให้ดูรูป Lifecycle (วงจรชีวิต) ของมัน แต่ ขออธิบายก่อนว่า เจ้าหุ่นเขียว เนี้ยมี lifecycle ไม่เหมือนใครเลย มันมี การแบ่งเป็น state อยู่ 3 แบบ

Activity State ของ Android มีไรบ้าง ???

จริงๆแล้ว state ของ Android มีแค่ 3 แบบเองน่ะ คือ
  1. Running / Resumed state : หมายถึง สภาวะ ที่ app แอรนดรอยของเรา ที่ทํางานอยู่บนหน้าจอเราเลย ( foreground )
  2. Paused state : หมายถึง สภาวะที่ app แอรนดรอยของเรา อยู่บนหน้าจอของเราเหมือนกันน่ะ แต่เพียงแต่มี หน้าอื่นขึ้นมาบังอยู่บางส่วน ซึ่งมันจะยังทํางานปกติดีน่ะ ถูกเก็บอยู่ใน Memory นะ และ ก็ มี window manager คอยดูแลมันอยู่ แต่โดน ปิดทิ้งได้เหมือนกันนะ ถ้าระบบเห็นว่า Memory มันเริ่มตํ่ามากๆแล้วจริงๆ
  3. Stopped state : หมายถึง สภาวะที่ app เรานี่โดนหน้าอื่นบังหมดล่ะ  ( background )  คนใช้ไม่เห็นมันล่ะ ซึ่งมันยังถูกเก็บอยู่ใน memory และ แต่ว่า window manager ไม่ได้ดูแลมันล่ะ แล้วก็ถ้า ระบบ ต้องการ Memory ที่ไหน มันก็จะปิดโปรแกรมเราทิ้งเลยล่ะ
สรุปแล้วจริงๆ ทั้ง Paused และ Stopped state สามารถโดนปิดทิ้งได้น่ะ ถ้าระบบต้องการ memory จริงๆ โดยมันจะไป เรียก finish() method อะ แล้วพอเรากลับมาเปิดอีกครั้ง มันต้องเริ่มต้นใหม่หมดเลยละ

มาดูรูปวงจรชีวิตของ Activity กันๆ

activity_lifecycle
งงล่ะสิ เป็นผมก็งงน่ะ ฮ่าๆ เวลาเจอครั้งแรกนี่ …. เริ่มจากงี้ดีกว่า เรารู้จัก state ต่างๆแล้วเนอะ เวลาที่ state มันเปลี่ยนไปมา มันจะแจ้งเตือนกลับมาในรูปแบบของ callback method แหละ
โดยที่ method เหล่านี้แหละ ที่เราจะนํามาเขียนอะไรเพิ่มเติมลงไป เพื่อจัดการกับ state ณ จังหวะนั้นให้อย่างเหมาะสมอย่างที่สุดเลย ส่วน method มีอะไรบ้างก็จะเห็นตามในรูปแหละ ว่ามี 6 method ดังนี้
  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroy()
ส่ว method เหล่านี้ทําอะไรบ้าง จะค่อยๆอธิบายไปน่ะ จะได้ไม่ งง กัน :)

ไอ้ Method เราจะแบ่งหน้าที่มันง่ายๆตาม ช่วงที่มันเกิดแหละ

ช่วงเวลาที่มันเกิดขึ้นจริงๆ แล้วมีแค่ 3 ช่วงเองน่ะ
  1. ช่วง entire lifetime : ช่วงที่ Activity มัน เกิดขึ้น (ตอนเปิด app/(layout) activity ครั้งแรกนั่นแหละ) มันก็จะเรียกonCreate() และ พอมันดับไป ก็จะเรียก onDestory() เพราะฉะนั้นเราจะทําการสร้างค่าเริ่มต้นของ Activity เราในonCreate() และ พอมันจะดับ เราก็ค่อย ปล่อยค่าต่างๆใน onDestory() นั่นเอง
  2. ช่วง visible time :  ช่วงนี้คือ ช่วยที่เราเล่นกับ app เรานั่นแหละ มันจะเรียกแค่ onStart() และ onStop() แค่นั้นแหละ อารมณ์จะประมาณว่า เราเปิด หน้าจอ A อยู่ แล้วก็ เปลี่ยนไปหน้าจอ B … จังหวะนี้แหละที่หน้าจอ A จะเรียก callback method onStop() ให้กับ A ทันทีเบย และ เรียก onStart() กับ B นั่นเอง
  3. ช่วง  foreground lifetime : ช่วง foreground คือ ช่วงที่มันสลับไปอยู่ด้านหลังแบบไม่หายทั้งจออะ มันก็จะสลับเรียก onPause() และ onResume() กันไป เช่น เวลามี dialog ลอยขึ้นมางี้ เจ้า activity ตัวแรก จะเข้าโหมดonPause() ไปโดยปริยาย
สังเกตุนะ ครบ 6 method ของวงจรชีวิต Activity แล้วนะ :) ลองกลับขึ้นไปดูรูปสิ จะเห็นว่า มันจับคู่นั่นเอง จากหัวลงมาเลยล่ะ มันมีความสัมพันธ์กันแบบนั้นแหละ

แล้วไอ้รูปข้างๆ ที่ไม่ใช่คู่กัน คือไรอะ???

ไม่ต้องตกใจไป
  • onRestart() : คือจังหวะที่ ผู้ใช้ อยู่ใน สภาวะ onStop() อยู่ แล้วเรากลับไปหามัน มันจะถูกเรียก และ เรียก onStart() ตามต่อเสมอๆเลย
  • App process killed : คือ จังหวะที่เคยบอกว่า ถ้า memory ไม่พอ หรือ App อื่นที่มี Priority สูงกว่าต้องการใช้ memory  มันจะดู activity ที่อยู่ในสภาวะ onPause() กับ onStop() แล้วก็ปิดทิ้งเลยล่ะ แล้วจะไปเรียก onCreate() ถ้าเรากลับมาเปิดใหม่

แล้วสงสัยไหมว่า ถ้าระบบมันปิด activity เราทิ้งไปแล้ว แล้วค่าใน activity นั้นทําไงอะ???

นั่นสิ สงสัยไหม? ว่าเราจะจัดการยังไง ถ้าข้อมูลสําคัญเราอยู่ตรงนั้น แล้วเราโดนปิดไป ยังงี้ค่าก็หายดิ!!! มา เรามาดูรูปข้างล่างกัน
restore_instance
จากรูปในกรอบ สี่เหลี่ยมเทาๆ จะเห็นว่า เรามี 2 callback method ที่มาช่วยเราจัดการเก็บค่าไว้คือ
  1. onSaveInstanceState() : คือ จังหวะที่ Activity ตัวอื่นๆเข้ามาอยู่หน้าแรก ( foreground ทั้งหมด ) มันจะไปเรียก method callback นี้ และก็ จัดการเก็บค่านี้ เป็น Bundle ซึ่ง Bundle จะเก็บค่าแบบ name-value pairs
  2. onRestoreInstanceState() : คือ จังหวะที่ Activity ถูก ปิดไปละ แต่ว่า ผู้ใช้กลับมาและกําลังจะเปิดมันอีกที จังหวะนี้แหละมันจะเรียก callback นี้ขึ้นมา และดึงค่าออกมาใช้ได้เลย
แต่สิ่งที่เราควรจําไว้อย่างนึงคือ ถ้าเราต้องการที่จะเก็บข้อมูลแบบจริงๆจังๆ เราควรจะใช้ method onPause()  หรือonStop() ไปเลยน่ะ เพราะว่าบาง event มันก็ไม่ชัวร์เลยที่ onSaveInstanceState() จะถูกเรียก เช่น จังหวะที่เรากด ปุ่มBack เพื่ออกจากโปรแกรม หรือ จังหวะที่ ระบบเราปิด activity ไปแล้ว มันจะไม่มี state ให้เราเก็บแล้วนั่นเอง

จบละ ง่ายไหม? มีแค่ 6 methodหลักเอง … มาสรุปกันดีกว่า !!!

สรุปได้ง่ายๆเลยว่า Activity Lifecycle ของ Android มีแค่ 6 method หลักๆเอง และ อยากจะแบ่งหน้าที่ของ method ต่างๆออกมาตามที่สมควรคือ
  • onCreate() : จะถูกเรียกเมื่อแรกสุดที่ Activity ถูกสร้าง เรา ใช้สร้างหน้าตาของ layout ก็ตอนนี้แหละ
  • onResume() : จะถูกเรียกเมื่อ Activity ถูกเรียกขึ้นมาใน foreground อีกที ใช้ ผูก services ตอนที่จะใช้อีกที หรือ สร้าง field ต่างๆ
  • onPause() : ถูกเรียกเมื่อ Activity อื่นมาทับไปแต่ไม่หมดนะ ใช้ปิด services ต่างๆก็ดี
  • onStop() : ถูกเรียกเมื่อ Activity ของเรากลายเป็น Background ไปละ ส่วนใหญ่ใช้ปิด database connection หรือ connection อื่นๆ
จริงๆ Activity Lifecycle ก็มีแค่นี้แหละ มันขึ้นอยู่กับว่าเราจะประยุกต์ใช้กับ Application เรายังไงมากกว่า :)
ไว้มาเขียนเพิ่มน่ะ คราวหน้ายังนึกไม่ออก เอาเป็นอะไรที่ลงมือทํากันจริงๆบ้างดีกว่า เพราะว่าๆหลักๆที่ต้องรู้ก่อนทํา ก็น่าจะมีแค่นี้เอง ที่เหลือมัน on the job ได้อะ ไว้มาเขียนเล่นต่อนะ

No comments: