รู้จักกับ activity lifecycle และ callback method

เขียนเมื่อ 9 ปีก่อน โดย Ninenik Narkdee
callback method android android studio activity lifecycle

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ callback method android android studio activity lifecycle

ดูแล้ว 9,459 ครั้ง


การจัดการเกี่ยวกับวัฏจักร Activity (Activity Lifecycle) ของ app
 
ขณะที่ผู้ใช้เปิดใช้งาน -> ออกจาก app -> แล้วก็กลับเข้ามาใน app อีกครั้ง 
activity จะมีการย้าย state ต่างๆ เกิดขึ้นในวัฏจักร activity  ยกตัวอย่างเช่น 
เมื่อ activity เริ่มทำงานครั้งแรก ก็จะแสดงขึ้นมาอยู่ด้านบนสุดของระบบ (foreground) 
และรอรับการทำงานจากผู้ใช้     ในระหว่างกระบวนการนี้ ระบบจะมีการเรียกใช้งาน callback method ต่างๆ
(callback method = method ที่ถูกเรียกใช้งานอัตโนมัติ) ใน activity ที่ได้กำหนดการทำงานให้กับ UI และสวนติดต่ออื่นๆ ไว้  
ถ้าผู้ใช้มีการใช้งานใดๆ ที่เป็นการเรียก activity อื่นขึ้นมา หรือสลับไปใช้งาน app อื่น 
ระบบก็จะเรียก callback method อีกอันขึ้นมา    เช่น ซ่อน app ไว้ด้านหลัง background 
(ไม่แสดง activity  แต่ instance และ state นั้นยังทำงานอยู่)
 
ภายใน callback method เราสามารถกำหนดการทำงานใน activity เมื่อผู้ใช้ออกจาก app 
และกลับเข้ามาใช้งาน app ใหม่อีกครั้งได้ ตัวอย่าง ถ้า app เราเป็น app streaming video
เราอาจจะสั่งให้ทำการหยุด video ชั่วคราว และปิดการเชื่อมต่อ network ไว้ก่อนเมื่อผู้ใช้สลับไปใช้ app อื่น
และทันทีที่ผู้ใช้กลับมาใช้งาน app ต่อ ก็ให้ทำการเชื่อมต่อกับ network และก็อนุญาตให้ผู้ใช้กลับไปเล่น video
ในตำแหน่งที่ค้างต่อไปทันทีได้ โดยที่ไม่ต้องเริ่มต้นใหม่ แบบนี้เป็นต้น
 
 
 
กระบวนการเริ่มทำงานของ Activity
 
ในระบบ android เรากำหนด code เริ่มต้นไว้ใน activity โดยสัมพันธ์กับ method ที่ถูกเรียกใช้งานอัตโนมัติ (callback method)
อย่างเป็นลำดับ ตั้งแต่เริ่มต้น activity ไปจนถึงสิ้นสุดและปิดการทำงานของ activity ลง
 
เนื้อหาตอนนี้เราจะได้รู้ภาพรวมที่สำคัญ เกี่ยวกับ lifecycle method
 
 
 
ทำความรู้จักกับ Lifecycle Callback
 
ในขณะที่ activity ทำงาน ระบบจะเรียกใช้ callback method ตามลำดับในลักษณะที่คล้ายกับ
การก่อพีระมิด นั่นก็คือ แต่ละขั้นตอนวัฏจักรของ activity  ก็คือส่วนแยกย่อยแต่ละขั้นของพีระมิด
เช่นว่า เมื่อระบบสร้าง instance ของ activity ขึ้นมาใหม่    method ที่เรียกใช้งานอัตโนมัติ (callback method)
ก็จะขยับ activity state ขึ้นมาด้านบน 
ด้านบน พีระมิด คือจุดที่ activity กำลังทำงาน แสดงอยู่ด้านหน้าสุด และผู้ใช้ กำลังใช้งานอยู่  
 
และเมื่อผู้ใช้กำลังจะออกจาก activity    ระบบจะก็เรียกใช้ method อื่น ซึ่งก็ทำให้ activity state
ถอยกลับไปอยู่ด้านล่างของพีระมิดตามลำดับเพื่อค่อยๆถอน activity ออกไป   ในบางกรณี activity
จะย้ายลงมาอยู่บางจุดและรอจังหวะที่จะถูกเรียกกลับขึ้นมาด้านบนอีก  
( กรณีเช่นเมื่อผู้ใช้สลับไปใช้งาน app อื่น แล้วกลับมาใช้งาน )


 
 
 
รูปแสดงวัฏจักรของ activity ในรูปแบบโครงสร้างพีระมิด โดยแสดงให้เห็นว่า method ที่เรียกใช้
งานอัตโมัติ ( callback method:: onCreate() onStart() onResume() onRestart() ) จะขยับ activity ขึ้นไปด้านบนสุดที่ resumed state
และก็มี method ( callback method:: onPause() onStop() onDestroy() ) ที่จะขยับ activity ลงมาด้านล่าง 
activity ยังสามารถกลับไปที่ตำแหน่ง resumed state จากตำแหน่ง Paused และ Stopped ได้อีกด้วย


 
 
เราอาจจะไม่จำเป็นต้องเรียกใช้งาน callback method ทั้งหมดก็ได้ ขึ้นกับความซับซ้อนของ
activity     อย่างไรก็ตามเป็นสิ่งสำคัญที่เราจะควรทำความเข้าใจแต่ละ method เพื่อให้มั่นใจ
ได้ว่า app ของเราตอบสนองเป็นไปตามที่ผู้ใช้คาดหวัง    ดังนั้นการใช้งาน callback method
ที่ถูกวิธีก็จะช่วยให้ app ของเราทำงานได้ดี รวมถึงสิ่งต่อไปนี้ด้วย
 
  • ไม่หยุดการทำงานหรือค้าง กรณีมีสายโทรเข้าหรือมีการสลับไปใช้งาน app อื่น 
  • ไม่ใช้ทรัพยากรที่มีค่าของระบบอย่างสูญเปล่า ถ้าไม่มีการใช้งาน activity ใดๆ 
  • ไม่กระทบต่อกระบวนการในขั้นตอนการใช้งานของผู้ใช้กรณีออกจาก app แล้วกลับเข้ามาอีกครั้ง 
  • ไม่หยุดการทำงานหรือระบบค้าง กระทบการใช้งานของผู้ใช้กรณีมีการหมุนหน้าจอแนวนอนและแนวตั้ง
 
 
สิ่งที่จะได้รู้ต่อไปคือ มีหลายเหตุการณ์ที่ activity มีการเปลี่ยน state ต่างๆ ตามแสดงในรูปด้านบน  
แต่มีอยู่ 3 state เท่านั้น ที่ activity จะยังคงอยู่คงที่    นั้นคือ activity จะยังคงอยู่ใน 3 state นี้ ในช่วง
เวลาระยะเวลาหนึ่ง ไม่เปลี่ยนไป state อื่นในทันที ได้แก่
 
Resumed 
(แสดงอยู่ ทำงานอยู่)
ใน state นี้ activity จะแสดงอยู่ด้านหน้าสุด และผู้ใช้กำลังใช้งานอยู่ บอกครั้งจะเรียกว่า running state
 
Paused  
(แสดงบางส่วน โดนบังไม่มิด)
ใน state นี้ activity จะถูกบดบังด้วย activity อื่น เช่น activity อื่น ที่อยู่ด้านหน้าสุดที่แสดงในลักษณะกึ่ง
โปรงใส หรือไม่ได้แสดงแบบเต็มหน้าจอ   activity ในสถานะนี้จะไม่สามารถรับค่าจากผู้ใช้ และทำงานคำสั่งใดๆ ได้
 
Stopped 
(แสดงแบบ background ผู้ใช้มองไม่เห็น)
ใน state นี้ activity จะถูกซ่อนอย่างสมบูรณ์และผู้ใช้มองไม่เห็น โดยจะถูกย้ายไปอยู่ด้านหลังในขณะที่อยู่ใน state นี้
ค่า activity instance และตัวแปรทั้งหมดจะยังคงอยู่ แต่จะไม่สามารถถูกเรียกใช้งานจาก code ใดๆ ได้
 
 
ในขณะที่ state อื่น เช่น Created และ Started จะแสดงชั่วคราว แล้วระบบก็จะเปลี่ยนไป state อื่น ในทันทีที่ 
method ถูกเรียกใช้งานอัตโนมัติ นั่นคือ หลังจากที่ระบบเรียกใช้งาน onCreate() แล้วก็จะเรียกใช้งาน onStart()
ทันที และสุดท้ายก็มาที่ onResumne()  ซึ่งก็จะเข้าสู่ Resumed state 
 
 
ทั้งหมดก็คือวัฏจักร activity เบื้อง้น ต่อไปเราจะได้เรียนรู้เกี่ยวกับการกำหนด การทำงานในวัฏจักร activity 
 
 
 
การกำหนด Launcher Activity ใน app ของเรา
 
เมื่อผู้ใช้กดที่ icon app ของเราจากหน้า Home screen เพื่อใช้งาน    ระบบก็จะเรียก onCreate() method
ขึ้นมาทำงานอัตโนมัติเพื่อที่จะเปิดใช้งาน activity ที่เราได้กำหนดให้เป็น activity หลัก ( "launcher" หรือ "main" )
ซึ่งก็จะเป็น activity ที่เป็นหน้าหลักที่ผู้ใช้จะเห็นเมื่อเข้ามาใช้งาน app
 
เราสามารถกำหนดได้ว่า activity ใด ที่จะใช้เป็น activity หลัก โดยกำหนดค่าในไฟล์ AndroidManifest.xml
 
activity หลักจะต้องกำหนด ค่าใน manifest ด้วย <intent-filter> 
 
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
 
โดยประกอบไปด้วย MAIN action 
และ LAUNCHER category ดังตัวอย่างดังนี้
 
<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>
 
 
ข้อสังเกต:: ใน android studio เมือ่เราสร้าง project android ขึ้นมา จะมีการประกาศค่าและกำหนด
ให้มีการเรียกใช้งาน filter นี้ในไฟล์ AndroidManifest.xml มาให้เรียบร้อยแล้ว
 
ถ้าไม่ได้กำหนด MAIN action และ LAUNCHER category แล้ว app icon ของเราจะไม่แสดงในหน้าหลักของ
ลิสรายการ app
 
 
 
การสร้าง Instance ใหม่
 
app ส่วนใหญ่จะประกอบไปด้วย activity หลายอันทำงานแตกต่างกันไป  ไม่ว่าจะเป็น Activity หลัก ที่ถูก
สร้างขึ้นเมื่อผู้ใช้คลิกที่ icon app หรือ activity ต่างๆ ที่ถูกเรียกใช้งานโดยผู้ใช้ ทั้งหมดล้วนแล้วเป็นสิ่งที่ระบบ
สร้าง instance ใหม่ของ activity โดยการเรียกใช้ผ่าน onCreate() method
 
เราต้องใช้ onCreate() method ในเหตุผลเพื่อเริ่มต้น application ซึ่งควรจะเกิดขึ้นเพียงครั้งเดียวตลอดหนึ่ง
วัฏจักรของ activity เช่นเราใช้ onCreate() กำหนดหน้าตาของ app หรือประกาศตัวแปรที่จะถูกใช้งานใน class เป็นต้น
 
ตัวอย่าง  
การใช้งาน onCreate() method ตามตัวอย่างด้านล่าง แสดง code เพื่อให้เห็นการตั้งค่าเบื่องต้น 
เช่น การกำหนด user interface (โดยใช้ XML layout ไฟล์) , การประกาศตัวแปรต่างๆ , 
การตั้งค่ากำหนดเงื่อนไข UI 
 
 
TextView mTextView; // การประกาศตัวแปรจำหรับ text view ใน layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // การกำหนด user interface (โดยใช้ XML layout ไฟล์) 
    // ไฟล์ layout ใน project จะอยู่ที่  res/layout/main_activity.xml 
    setContentView(R.layout.main_activity);
    
    // กำหนดค่าให้กับ TextView ดังนั้นเราสามารถเรียกใช้งานผ่านชื่อตัวแปรได้ภายหลัง
    mTextView = (TextView) findViewById(R.id.text_message);

    // ตั้งค่าสำหรับกำหนดเงื่อนไข UI 
    // ตรวจสอบเพื่อยืนยันว่าเรากำลังใช้งานบน android  Honeycomb   
    // หรือสูงกว่า เพื่อเรียกใช้ ActionBar API  
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // กำหนดให้ icon ใน action bar ไม่ทำงานคล้ายปุ่ม Home  
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}
 
 
เมื่อ onCreate() ทำงานเสร็จ ระบบจะเรียก onStart() และ onResume() memthod มาทำงานต่อในทันที
activity ของเราจะไม่อยู่ใน Created state หรือ Started state     ในทางเทคนิค activity จะแสดงขึ้นมาทันที
ที่ onStart() ถูกเรียกใช้งาน แต่ onResume() จะแสดงตามมาติดๆ ในทันทีและก็จะอยู่ใน Resumed state จนกว่า
จะมีการเปลี่ยนแปลงบางอย่างเกิดขึ้น เช่น มีสายโทรเข้าหรือผู้ใช้เปิดไป activity อืน หรือปิดหน้าจอลง
 
ในบทเรียนต่อไป เราจะได้เห็นว่า method ที่เริ่มต้นอื่นๆ เช่น onStart() และ onResume() มีประโยชน์ในวัฏจักรของ
activity อย่างไรเมื่อกลับจาก Paused หรือ Stoped state มาที่ Resumed state 
 
 
ข้อสังเกต::  ใน onCreate() method จะมี parameter ที่ชื่อ savedInstanceState ซึ่งเราจะได้มาดูกันต่อภายหลังในเรื่องเกี่ยวกับ
การสร้าง activity ขึ้นมาใหม่
 
 
 
โครงสร้างของวัฏจักร activity ที่เน้นไปที่ 3 method หลัก ที่ระบบเรียกใช้อัตโนมัติตามลำดับ เมื่อมีการสร้าง instance
ของ activity ขึ้นมาใหม่ ได้แก่ onCreate(), onStart() และ onResume() เมื่อลำดับการทำงานเสร็จสิ้นลง activity จะ
มาอยู่ที่ Resumed state ซึ่งผู้ใช้ใช้งานอยู่ จนกว่าจะเปลียนไปเรียกใช้งาน activity อื่นขึ้นมา
 
 
 
การสิ้นสุดการทำงานของ Activity (Destroy Activity)
 
ในขณะที่วัฏจักรของ activity มี method แรก คือ onCreate() และ method สุดท้ายคือ onDestroy()
ระบบจะเรียก method นี้ใน activity เป็นสัญญาณว่า activity instance นี้จะถูกลบบออกอย่างสมบูรณ์จาก
หน่วยความจำของระบบ (system memory)
 
app ส่วนใหญ่ ไม่จำเป็นต้องกำหนด method นี้ เพราะว่า local class ถูกทำลายไปพร้อมกับ activity
และ activity แทบจะถูกลบไปอย่่างสมบูร์ในระหว่างเรียกใช้งาน onPause() และ onStop()   อย่างไรก็ตาม
ถ้า activity ของเรามีการกำหนดให้มีการทำงานแบบ background (อยู่เบื้องหลัง) ในขั้นตอน onCreate() ด้วยแล้ว
หรือ มีการใช้งานทรัพยากรของระบบเป็นระยะเวลานาน เป็นเหตุให้ความจำถูกใช้งานจำนวนมากหากไม่ทำการปิด
การใช้งาน จึงควรอย่างยิ่งที่จะเรียกใช้งาน method onDestroy() เพื่อคืนค่าหน่วยความจำให้ระบบ
 
 
@Override
public void onDestroy() {
    super.onDestroy();  // เรียกใช้งาน superclass ทุกครั้งเสมอ
    
    // หยุดการติดตามหรือตรวจจับ method ของ activity 
    android.os.Debug.stopMethodTracing();
}
 
 
ข้อสังเกต:: ระบบจะเรียกใช้งาน onDestroy() หลังจากเรียกใช้งาน onPause() และ onStop() แล้วในทุกเหตุการณ์ ยกเว้นกรณี
มีการกำหนดให้เรียกใช้ finish() ภายใน onCreate() method ในกรณีเช่น activity หยุดชั่วคราวเพื่อทำการเรียก
ใช้งาน activity อื่นข้ามา แล้วเราทำการกำหนดให้ มีการเรียกใช้งาน finish() ที่กำหนดใน onCreate() method เพื่อทำลาย
activity ในกรณีนี้ ระบบจะทำการเรียก onDestroy() ทันทีโดยไม่ผ่าน callback method อื่น เช่นไม่ผ่าน onPause() หรือ onStop() แบบนี้เป็นต้น
 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ