Activity Lifecycle: คืออะไร onCreate onStart onResume ใน Android

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-03-03 เวลาอ่าน: 12 นาที

Activity Lifecycle คือชุดของเมธอด callback ที่ Android เรียกเมื่อ Activity เปลี่ยนระหว่างสถานะต่าง ๆ: การสร้าง การมองเห็น โฟกัสอินพุต การสูญเสียการมองเห็นบางส่วน การซ่อนทั้งหมด และการทำลาย ระบบจะจัดการวงจรชีวิตของแต่ละหน้าจอของแอปพลิเคชัน เริ่มตั้งแต่ช่วงเวลาเรียก onCreate() จนถึง onDestroy() การทำความเข้าใจสถานะเหล่านี้เป็นข้อกำหนดที่จำเป็นสำหรับการทำงานที่เสถียรของแอปพลิเคชัน Android เนื่องจากการจัดการการเปลี่ยนระหว่างเมธอดที่ไม่ถูกต้องนำไปสู่การรั่วไหลของหน่วยความจำ การสูญเสียข้อมูลผู้ใช้ และการหยุดทำงานที่ไม่คาดคิด อ่านเพิ่มเติมเกี่ยวกับสถาปัตยกรรม Android ได้ใน บทความทั่วไปเกี่ยวกับ Android

ประเด็นสำคัญ

  • Activity Lifecycle — ลำดับของเมธอดที่กำหนดอย่างเคร่งครัด: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • onCreate — เมธอดบังคับเพียงเมธอดเดียว เรียกหนึ่งครั้งเมื่อสร้าง Activity; ที่นี่ดำเนินการเริ่มต้น UI และข้อมูล
  • onResume — Activity อยู่เบื้องหน้าและโต้ตอบกับผู้ใช้; นี่คือสถานะการทำงานของหน้าจอ
  • onPause / onStop — เมื่อเปลี่ยนไปพื้นหลัง Activity จะหยุดชั่วคราวก่อน จากนั้นหยุด; ข้อมูลสำคัญจะถูกบันทึกใน onPause
  • onSaveInstanceState — กลไกการบันทึกสถานะ UI เมื่อหมุนหน้าจอและการสร้าง Activity ใหม่โดยระบบ
  • วงจรชีวิตของ Fragment — คล้ายกับ Activity แต่เพิ่มเมธอด onAttach, onCreateView, onViewCreated, onDestroyView
  • LifecycleObserver — คอมโพเนนต์ Jetpack สำหรับการติดตามสถานะแบบรีแอกทีฟโดยไม่ต้องโอเวอร์ไรด์เมธอดใน Activity

Activity Lifecycle คืออะไร

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

การทำความเข้าใจวงจรชีวิตเป็นสิ่งจำเป็นสำหรับนักพัฒนา Android ทุกคน เนื่องจากระบบสามารถทำลาย Activity ได้ทุกเมื่อเมื่อหน่วยความจำไม่เพียงพอ — และแอปพลิเคชันต้องกู้คืนสถานะอย่างถูกต้อง ตามข้อมูล Google Android Vitals (2025) แอปพลิเคชันที่ไม่จัดการการบันทึกสถานะใน onSaveInstanceState() แสดง 42% การหยุดทำงานมากขึ้นเมื่อสร้าง Activity ใหม่

วงจรชีวิตประกอบด้วยเมธอด callback หลักหกเมธอด: onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy() นอกจากนี้ยังมีเมธอด onRestart() ซึ่งเรียกก่อน onStart() เมื่อ Activity กลับจากสถานะหยุด แต่ละเมธอดมีวัตถุประสงค์และเวลาในการดำเนินการที่กำหนดอย่างเคร่งครัด — ระบบเรียกตามลำดับ และนักพัฒนาสามารถโอเวอร์ไรด์เมธอดใด ๆ เพื่อใช้ตรรกะของตนเอง

วงจรสามารถแบ่งออกเป็นสามขั้นตอนหลัก: อายุการใช้งานทั้งหมด (onCreate → onDestroy), อายุการใช้งานที่มองเห็นได้ (onStart → onStop) และอายุการใช้งานเบื้องหน้า (onResume → onPause) การทำความเข้าใจสามระดับนี้ช่วยกระจายโค้ดการเริ่มต้นและการปล่อยทรัพยากรอย่างถูกต้อง

เมธอดของวงจรชีวิต Activity

แต่ละเมธอดของวงจรชีวิตทำงานที่กำหนดอย่างเคร่งครัด ระบบเรียกตามลำดับที่แน่นอน และนักพัฒนาควรโอเวอร์ไรด์เฉพาะเมธอดที่จำเป็นสำหรับตรรกะเฉพาะเท่านั้น ไม่แนะนำให้เรียกเมธอดวงจรชีวิตโดยตรง — Android Runtime จัดการเรื่องนี้

ลำดับการเรียกทั่วไป

ลำดับทั่วไปเมื่อเปิดแอปพลิเคชัน: onCreate → onStart → onResume เมื่อกดปุ่มย้อนกลับ: onPause → onStop → onDestroy เมื่อย่อ: onPause → onStop จากนั้นเมื่อกลับมา: onRestart → onStart → onResume

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        super.onStart()
    }

    override fun onResume() {
        super.onResume()
    }

    override fun onPause() {
        super.onPause()
    }

    override fun onStop() {
        super.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
    }

    override fun onRestart() {
        super.onRestart()
    }
}

แต่ละเมธอดที่โอเวอร์ไรด์ ต้องเรียกเวอร์ชัน super ของมัน — หากไม่มี ระบบจะไม่สามารถดำเนินการเปลี่ยนสถานะได้อย่างถูกต้อง กฎนี้กำหนดไว้ในเอกสาร Android Developers และตรวจสอบโดยกฎ lint ของ Android Studio

สามระดับของวงจรชีวิต

ระดับแรก — อายุการใช้งานทั้งหมด: ช่วงระหว่าง onCreate และ onDestroy ที่นี่ดำเนินการเริ่มต้นเพียงครั้งเดียวและการปล่อยทรัพยากรทั่วโลกครั้งสุดท้าย ระดับที่สอง — อายุการใช้งานที่มองเห็นได้: ระหว่าง onStart และ onStop Activity มองเห็นได้บนหน้าจอแต่อาจถูกหน้าต่างอื่นบังบางส่วน ระดับที่สาม — อายุการใช้งานเบื้องหน้า: ระหว่าง onResume และ onPause Activity อยู่บนสุดของสแต็กงานและโต้ตอบกับผู้ใช้

onCreate — การสร้าง Activity

onCreate() — เมธอดแรกและเมธอดบังคับเพียงเมธอดเดียวของวงจรชีวิต Activity ระบบเรียกหนึ่งครั้งเมื่อสร้างอินสแตนซ์ Activity เมธอดนี้รับพารามิเตอร์ savedInstanceState: Bundle? ซึ่งมีสถานะที่บันทึกไว้ก่อนหน้านี้หาก Activity ถูกสร้างใหม่หลังการทำลาย — ตัวอย่างเช่น เมื่อหมุนหน้าจอ

ภายใน onCreate ดำเนินการงานต่อไปนี้: การเริ่มต้นส่วนติดต่อผู้ใช้ผ่าน setContentView() ด้วยทรัพยากรเลย์เอาต์ การผูกองค์ประกอบ View ผ่าน findViewById() การตั้งค่าอะแดปเตอร์สำหรับ RecyclerView และ ViewPager การกู้คืนสถานะจาก savedInstanceState การเริ่มต้น ViewModel และ LiveData การตั้งค่าตัวฟังคลิกและท่าทาง เมธอดควรเสร็จสิ้นโดยเร็วที่สุด — การดำเนินการที่ยาวนานที่นี่บล็อกการเรนเดอร์เฟรมแรก ซึ่งเพิ่มเวลาเริ่มต้นแอปพลิเคชัน

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_profile)

    val userNameText: TextView = findViewById(R.id.user_name)
    val loadButton: Button = findViewById(R.id.load_button)

    if (savedInstanceState != null) {
        userNameText.text = savedInstanceState.getString("user_name")
    }

    loadButton.setOnClickListener {
        loadUserProfile()
    }
}

หาก Activity ถูกสร้างครั้งแรก savedInstanceState เป็น null เมื่อสร้างใหม่หลังหมุนหน้าจอ Bundle จะมีข้อมูลที่บันทึกใน onSaveInstanceState() การตรวจสอบ null เป็นแนวปฏิบัติมาตรฐานสำหรับการกู้คืน UI อย่างถูกต้องโดยไม่สูญเสียข้อมูลที่ผู้ใช้ป้อน

onStart — การปรากฏบนหน้าจอ

onStart() ถูกเรียกทันทีหลังจาก onCreate() หรือหลังจาก onRestart() เมื่อ Activity ปรากฏให้ผู้ใช้เห็น ในสถานะนี้ Activity ยังไม่อยู่เบื้องหน้าและไม่สามารถโต้ตอบกับผู้ใช้ได้ แต่ส่วนติดต่อผู้ใช้ของมันปรากฏบนหน้าจอแล้ว ตัวอย่างเช่น เมื่อเปิดแอปพลิเคชัน ระบบจะเรนเดอร์เฟรมแรกของส่วนติดต่อระหว่างการเรียก onStart และ onResume

ในเมธอด onStart มักดำเนินการต่อไปนี้: เริ่มแอนิเมชันที่ควรทำงานขณะที่ Activity มองเห็นได้; ผูก BroadcastReceiver; เชื่อมต่อกับบริการระบุตำแหน่งและเซ็นเซอร์; อัปเดตข้อมูลจาก ViewModel หรือ Room การผูกกับ Bound services ผ่าน bindService() ก็ดำเนินการที่นี่หากแอปพลิเคชันใช้สถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ภายในกระบวนการ

kotlin
override fun onStart() {
    super.onStart()
    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER,
        5000L,
        10f,
        locationListener
    )
}

override fun onStop() {
    super.onStop()
    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    locationManager.removeUpdates(locationListener)
}

กฎสำคัญ: ทรัพยากรที่เชื่อมต่อใน onStart ต้องปล่อยใน onStop สิ่งนี้รับประกันว่าเมื่อ Activity ไม่ปรากฏบนหน้าจอ มันจะไม่ใช้แบตเตอรี่และทรัพยากรระบบ Google Play Store ตรวจสอบแอปพลิเคชันเพื่อหารั่วไหลของ LocationListener และบริการระบบอื่น ๆ เมื่อตรวจสอบอัปเดต

onResume — การรับโฟกัส

onResume() — สถานะที่ Activity อยู่เบื้องหน้าและพร้อมโต้ตอบกับผู้ใช้ นี่คือสถานะการทำงานของหน้าจอ: ระบบถ่ายโอนโฟกัสอินพุตไปยัง Activity และเหตุการณ์สัมผัส การป้อนคีย์บอร์ด และท่าทางทั้งหมดถูกส่งไปยังหน้าจอนี้ เมธอด onResume ถูกเรียกทุกครั้งที่ Activity กลับมาเบื้องหน้า — หลังจาก Activity อื่นเสร็จสิ้น หลังจากปิดกล่องโต้ตอบ หรือหลังจากปลดล็อกอุปกรณ์

ใน onResume ดำเนินการ: การเริ่มแอนิเมชันต่อที่หยุดชั่วคราวใน onPause; การเปิดกล้องและทรัพยากรพิเศษอื่น ๆ; การลงทะเบียนตัวฟังเซ็นเซอร์ (มาตรวัดความเร่ง, ไจโรสโคป); การเริ่มตัวจับเวลาและนาฬิกาจับเวลาสำหรับ UI; การอัปเดตเนื้อหาหน้าจอด้วยข้อมูลปัจจุบัน คู่ onResume/onPause ใช้สำหรับทรัพยากรที่ควรทำงานเมื่อมีโฟกัสเท่านั้น — ตัวอย่างเช่น การรู้จำเสียงอย่างต่อเนื่องหรือการบันทึกวิดีโอ

kotlin
override fun onResume() {
    super.onResume()
    cameraHolder.openCamera()
    animator.resume()
    sensorManager.registerListener(
        stepCounter,
        sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
        SensorManager.SENSOR_DELAY_NORMAL
    )
}

override fun onPause() {
    super.onPause()
    cameraHolder.closeCamera()
    animator.pause()
    sensorManager.unregisterListener(stepCounter)
}

ความแตกต่างระหว่าง onStart และ onResume มีนัยสำคัญ: Activity สามารถมองเห็นได้ (onStart) แต่ไม่ทำงาน (onResume) — ตัวอย่างเช่น เมื่อกล่องโต้ตอบป๊อปอัปหรือหน้าจอล็อกโปร่งใสแสดงทับอยู่ ใน onResume ไม่ใช่ onStart ที่ควรเปิดทรัพยากรพิเศษที่ต้องการการเข้าถึงแต่เพียงผู้เดียว

onPause — การสูญเสียโฟกัส

onPause() ถูกเรียกเมื่อ Activity สูญเสียโฟกัสอินพุต แต่ยังคงมองเห็นได้บางส่วน สถานการณ์ทั่วไป: การเปิดกล่องโต้ตอบ การกดปุ่มแอปล่าสุด การเรียกเข้า การกดปุ่มโฮม (ในกรณีนี้ onPause จะตามด้วย onStop) เมธอด onPause เป็นตำแหน่งที่เชื่อถือได้สุดท้ายในการบันทึกข้อมูลที่ผู้ใช้ไม่ควรสูญเสีย

ใน onPause ดำเนินการ: การบันทึกร่างอีเมลและแบบฟอร์มป้อนข้อมูลใน Room หรือ SharedPreferences; การหยุดแอนิเมชันและการเล่นวิดีโอ; การปิดกล้องและการปล่อยทรัพยากรพิเศษ; การยกเลิกการดำเนินการที่มีค่าใช้จ่ายสูงที่ไม่สำคัญในพื้นหลัง เมธอด onPause ควรเสร็จสิ้นใน น้อยกว่า 100 มิลลิวินาที — ระบบบล็อกการเปลี่ยนไปยัง Activity ถัดไปจนกว่า onPause จะคืนการควบคุม และการเกินขีดจำกัดนำไปสู่ ANR (Application Not Responding)

kotlin
override fun onPause() {
    super.onPause()
    val editor = SharedPreferences.Manager ...
    editor.putString("draft_text", draftEditText.text.toString())
    editor.apply()
    videoView.pause()
    cameraHolder.release()
}

สำคัญ: onPause ดำเนินการบนเธรด UI ดังนั้นการดำเนินการที่บล็อกใด ๆ เช่นการเขียนลงฐานข้อมูลผ่าน Room ด้วยการสอบถามแบบซิงโครนัสควรถูกแทนที่ด้วยแบบอะซิงโครนัส (coroutines) หรือดำเนินการบนเธรดพื้นหลัง ใช้ apply() แทน commit() สำหรับ SharedPreferences — apply เขียนข้อมูลแบบอะซิงโครนัสและไม่บล็อกเธรด UI

onStop — การซ่อนจากหน้าจอ

onStop() ถูกเรียกเมื่อ Activity หยุดปรากฏให้ผู้ใช้เห็น สิ่งนี้เกิดขึ้นในกรณีต่อไปนี้: Activity ถูกบังทั้งหมดโดย Activity อื่น; ผู้ใช้กดปุ่มโฮมหรือสลับไปยังแอปพลิเคชันอื่น; Activity กำลังสิ้นสุด (จากนั้น onDestroy จะถูกเรียก) ในสถานะ onStop Activity ยังคงอยู่ในหน่วยความจำและคงฟิลด์ทั้งหมดไว้ — มันไม่ถูกทำลาย แต่ก็ไม่ทำงาน

ใน onStop ดำเนินการ: การยกเลิกการลงทะเบียน BroadcastReceiver ที่ลงทะเบียนใน onStart; การตัดการเชื่อมต่อจาก Bound services; การปล่อย LocationListener, SensorListener และตัวฟังระบบอื่น ๆ; การหยุดการดำเนินการพื้นหลังระยะยาวที่ไม่จำเป็นเมื่อแอปพลิเคชันถูกซ่อน; การเขียนสถานะ UI ปัจจุบันลงใน Bundle ผ่าน onSaveInstanceState() หากยังไม่ได้ทำใน onPause

kotlin
override fun onStop() {
    super.onStop()
    unregisterReceiver(connectivityReceiver)
    unbindService(serviceConnection)
    if (isChangingConfigurations()) {
        Log.d("Lifecycle", "Activity ถูกสร้างใหม่เนื่องจากการกำหนดค่า")
    }
}

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

onDestroy — การทำลาย Activity

onDestroy() — เมธอดวงจรชีวิตสุดท้ายที่เรียกก่อนการทำลาย Activity อย่างสมบูรณ์ ระบบเรียก onDestroy ในสองกรณี: Activity สิ้นสุดผ่าน finish() หรือผู้ใช้กดปุ่มย้อนกลับ; Activity ถูกทำลายโดยระบบเนื่องจากการเปลี่ยนการกำหนดค่า (เช่น หมุนหน้าจอ) และจะถูกสร้างใหม่ เมธอด onDestroy อนุญาตให้ทำความสะอาดทรัพยากรครั้งสุดท้าย: การปลดเธรดและ coroutines การปิดเคอร์เซอร์และซ็อกเก็ตที่เปิดถาวร การปล่อยหน่วยความจำเนทีฟผ่าน NDK

kotlin
override fun onDestroy() {
    super.onDestroy()
    backgroundJob.cancel()
    dbHelper.close()
    if (isFinishing) {
        Log.d("Lifecycle", "Activity กำลังสิ้นสุดอย่างถาวร")
    } else {
        Log.d("Lifecycle", "Activity จะถูกสร้างใหม่")
    }
}

หมายเหตุสำคัญ: ไม่รับประกันว่า onDestroy จะถูกเรียก หากกระบวนการแอปพลิเคชันถูกฆ่าโดยระบบ (out-of-memory kill) ดังนั้นไม่สามารถพึ่งพา onDestroy สำหรับการบันทึกข้อมูลได้ — งานนี้จัดการใน onPause หรือ onStop คุณสมบัติ isFinishing ช่วยแยกความแตกต่างระหว่างการสิ้นสุด Activity ผ่าน finish() กับการสร้างใหม่เนื่องจากการเปลี่ยนการกำหนดค่า

onRestart — การกลับจากสถานะหยุด

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

kotlin
override fun onRestart() {
    super.onRestart()
    refreshDataFromNetwork()
    Log.d("Lifecycle", "Activity กำลังเริ่มต้นใหม่จากสแต็ก")
}

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

การหมุนหน้าจอและการบันทึกสถานะ

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

onSaveInstanceState และ onRestoreInstanceState

onSaveInstanceState() ถูกเรียกก่อนการทำลาย Activity เพื่อบันทึกสถานะชั่วคราว ข้อมูลที่บันทึกถูกส่งไปยัง onCreate ผ่านพารามิเตอร์ savedInstanceState และไปยังเมธอด onRestoreInstanceState() ซึ่งเรียกหลัง onStart Bundle มีขีดจำกัดขนาด — ประมาณ 500 KB ดังนั้นข้อมูลปริมาณมาก (เช่น บิตแมป) จะถูกบันทึกผ่าน ViewModel

xml
<!-- AndroidManifest.xml — การตรึงการวางแนว -->
<activity android:name=".MainActivity"
    android:configChanges="orientation|screenSize" />

การตรึงการวางแนวผ่าน android:configChanges ป้องกันการสร้าง Activity ใหม่ แต่ถือเป็นปฏิยานุกรมหากแอปพลิเคชันต้องรองรับทั้งสองการวางแนว คำแนะนำสมัยใหม่ของ Google คือการใช้ ViewModel ร่วมกับ onSaveInstanceState สำหรับข้อมูลที่ผู้ใช้ป้อนใน UI

วงจรชีวิตของ Fragment

Fragment มีวงจรชีวิตของตัวเอง คล้ายกับ Activity แต่มีเมธอดเพิ่มเติม: onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach Fragment อยู่ภายใน Activity เสมอ และวงจรชีวิตของมันผูกกับวงจรชีวิตของ Activity ที่เป็นคอนเทนเนอร์ ถ้า Activity ถูกทำลาย Fragment ก็จะถูกทำลายตาม

ความแตกต่างหลัก: Fragment จัดการไม่เพียงแต่สถานะของคอมโพเนนต์เท่านั้น แต่ยังจัดการลำดับชั้นของ View ด้วย เมธอด onCreateView ส่งคืน View หลักของ Fragment และ onDestroyView ทำลายลำดับชั้นนี้ สิ่งนี้ช่วยให้ Fragment อยู่รอดการสร้าง Activity ใหม่เมื่อหมุนหน้าจอ: Fragment ถูกเก็บรักษาไว้ และ View ของมันถูกสร้างใหม่ใน onCreateView

kotlin
class ProfileFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.fragment_profile, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val avatarImage: ImageView = view.findViewById(R.id.avatar_image)
        loadAvatar(avatarImage)
    }
}

การทำความเข้าใจความแตกต่างระหว่าง onCreate และ onCreateView มีความสำคัญอย่างยิ่ง: onCreate ถูกเรียกหนึ่งครั้งต่ออายุของ Fragment (แม้เมื่อ View ถูกสร้างใหม่) ในขณะที่ onCreateView ถูกเรียกทุกครั้งที่ Fragment สร้างหรือสร้างลำดับชั้น View ใหม่ การเริ่มต้นข้อมูลดำเนินการใน onCreate ในขณะที่การผูก UI ดำเนินการใน onViewCreated

LifecycleObserver และ Jetpack

LifecycleObserver — คอมโพเนนต์ของไลบรารี Android Jetpack ที่ช่วยให้ตอบสนองต่อการเปลี่ยนแปลงวงจรชีวิตโดยไม่ต้องโอเวอร์ไรด์เมธอดใน Activity หรือ Fragment แทนที่จะทำซ้ำโค้ดในทุกเมธอดวงจรชีวิต นักพัฒนาสร้างคลาสแยกต่างหากด้วยคำอธิบายประกอบ @OnLifecycleEvent และส่งต่อไปยัง lifecycle.addObserver()

Jetpack ยังมีอินเทอร์เฟซ LifecycleOwner ซึ่ง AppCompatActivity และ Fragment เป็นผู้ดำเนินการ วัตถุใด ๆ ที่ดำเนินการ LifecycleOwner สามารถจัดการการสมัครรับ LiveData, coroutines ผ่าน lifecycleScope และ WorkManager ที่เกี่ยวข้องกับวงจรชีวิต นี่คือรากฐานของสถาปัตยกรรม Android สมัยใหม่ที่ใช้ MVVM และ Jetpack

kotlin
class MyLocationObserver(private val context: Context) : DefaultLifecycleObserver {
    override fun onStart(owner: LifecycleOwner) {
        startLocationUpdates()
    }

    override fun onStop(owner: LifecycleOwner) {
        stopLocationUpdates()
    }
}

// ใน Activity:
lifecycle.addObserver(MyLocationObserver(this))

การใช้ DefaultLifecycleObserver ช่วยลดความซับซ้อนของการทดสอบ ลดการทำซ้ำโค้ด และทำให้ตรรกะวงจรชีวิตสามารถนำกลับมาใช้ใหม่ข้ามหน้าจอต่าง ๆ ได้ นี่คือการแทนที่สมัยใหม่สำหรับการโอเวอร์ไรด์ onStart/onStop ด้วยตนเองในทุก Activity ในแอปพลิเคชัน Android ที่พัฒนาโดย IT Sectr เราใช้ LifecycleObserver สำหรับการระบุตำแหน่ง การสแกน Bluetooth และการวิเคราะห์ — ซึ่งลดปริมาณโค้ดโบยเลอร์เพลตลง 30–40%

คำถามที่พบบ่อย

จะเกิดอะไรขึ้นหากไม่เรียก super ในเมธอดวงจรชีวิต?

หากไม่เรียก super.onCreate() หรือเมธอด super วงจรชีวิตอื่น ๆ ระบบจะโยนข้อยกเว้น SuperNotCalledException และแอปพลิเคชันจะหยุดทำงาน นี่เป็นข้อกำหนดที่เข้มงวดของ Android Runtime — แต่ละเมธอดต้องมอบหมายการดำเนินการให้กับคลาสพื้นฐาน มิฉะนั้นเครื่องสถานะภายในจะไม่สามารถเปลี่ยนไปยังสถานะถัดไปได้

ทำไม Activity ถึงถูกสร้างใหม่เมื่อหมุนหน้าจอ?

Activity ถูกสร้างใหม่เมื่อหมุนหน้าจอเพราะ การเปลี่ยนการวางแนวคือการเปลี่ยนการกำหนดค่าอุปกรณ์ โดยค่าเริ่มต้น Android จะทำลาย Activity และสร้างใหม่เพื่อโหลดทรัพยากรทางเลือก (layout-land, values-land) เพื่อปิดการสร้างใหม่ สามารถเพิ่มแอตทริบิวต์ android:configChanges ในแมนิเฟสต์ แต่ Google แนะนำให้ใช้ ViewModel เพื่อรักษาข้อมูล

ควรบันทึกข้อมูลในเมธอดใดก่อนปิดแอปพลิเคชัน?

ข้อมูลสำคัญจะถูกบันทึกใน onPause() เนื่องจากนี่เป็นเมธอดสุดท้ายที่รับประกันว่าจะถูกเรียกก่อนที่แอปพลิเคชันจะถูกฆ่าโดยระบบ หลังจาก onStop และ onDestroy ระบบสามารถสิ้นสุดกระบวนการโดยไม่เรียกเมธอดเพิ่มเติม สำหรับร่างและข้อมูลระหว่างกลาง ให้ใช้ SharedPreferences กับ apply() หรือ Room กับ coroutines

ความแตกต่างระหว่าง onPause และ onStop คืออะไร?

onPause ถูกเรียกเมื่อ Activity สูญเสียโฟกัสแต่ยังคงมองเห็นได้บางส่วน (เช่น เปิดกล่องโต้ตอบ) onStop ถูกเรียกเมื่อ Activity ถูกซ่อนจากหน้าจออย่างสมบูรณ์โดย Activity อื่นหรือโดยการกดปุ่มโฮม ความแตกต่างในทางปฏิบัติหลัก: onPause เป็นจุดสุดท้ายสำหรับการบันทึกข้อมูล onStop เป็นสถานที่สำหรับปล่อยตัวฟังและบริการระบบที่ไม่จำเป็นในพื้นหลัง

ViewModel คืออะไรและเกี่ยวข้องกับวงจรชีวิตอย่างไร?

ViewModel คือคอมโพเนนต์ Android Jetpack ที่เก็บข้อมูล UI และอยู่รอดการเปลี่ยนการกำหนดค่า (การหมุนหน้าจอ) โดยอัตโนมัติ ViewModel จะไม่ถูกทำลายเมื่อ Activity ถูกสร้างใหม่: มันมีชีวิตอยู่จนกว่า LifecycleOwner (Activity หรือ Fragment) จะสิ้นสุดอย่างสมบูรณ์ สิ่งนี้แก้ปัญหาการรักษาข้อมูลระหว่างการหมุนหน้าจอโดยไม่ต้องใช้ Bundle และ onSaveInstanceState ViewModel เป็นองค์ประกอบบังคับของสถาปัตยกรรม MVVM ที่ Google แนะนำ

สรุป

  • Activity Lifecycle — ลำดับของเมธอด onCreate, onStart, onResume, onPause, onStop, onDestroy แต่ละเมธอดรับผิดชอบเฟสเฉพาะของการทำงานของหน้าจอ
  • onCreate — การเริ่มต้น UI และการรับ savedInstanceState เมื่อสร้างใหม่; เมธอดบังคับเพียงเมธอดเดียว
  • onStart / onStop — คู่สำหรับจัดการการมองเห็น: การลงทะเบียนและปล่อยตัวฟังและบริการระบบ
  • onResume / onPause — คู่สำหรับจัดการโฟกัส: ทรัพยากรพิเศษ (กล้อง, เซ็นเซอร์) เปิดใน onResume และปิดใน onPause
  • การหมุนหน้าจอ — สร้าง Activity ใหม่โดยค่าเริ่มต้น; การรักษาสถานะผ่าน onSaveInstanceState + ViewModel เป็นแนวปฏิบัติมาตรฐาน
  • วงจรชีวิตของ Fragment — เพิ่มเมธอด onAttach, onCreateView, onViewCreated, onDestroyView, onDetach; View ถูกสร้างและทำลายแยกจาก Fragment เอง
  • LifecycleObserver — คอมโพเนนต์ Jetpack สำหรับการติดตามวงจรชีวิตแบบรีแอกทีฟโดยไม่ต้องทำซ้ำโค้ดใน Activity
  • ViewModel — อยู่รอดการเปลี่ยนการกำหนดค่าและแก้ปัญหาการสูญเสียข้อมูลระหว่างหมุนหน้าจอโดยไม่ต้องบันทึกด้วยตนเองใน Bundle
  • กฎ super — แต่ละเมธอดวงจรชีวิตที่โอเวอร์ไรด์ต้องเรียกเวอร์ชัน super มิฉะนั้นระบบจะโยน SuperNotCalledException

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม