Activity Lifecycle คือชุดของเมธอด callback ที่ Android เรียกเมื่อ Activity เปลี่ยนระหว่างสถานะต่าง ๆ: การสร้าง การมองเห็น โฟกัสอินพุต การสูญเสียการมองเห็นบางส่วน การซ่อนทั้งหมด และการทำลาย ระบบจะจัดการวงจรชีวิตของแต่ละหน้าจอของแอปพลิเคชัน เริ่มตั้งแต่ช่วงเวลาเรียก onCreate() จนถึง onDestroy() การทำความเข้าใจสถานะเหล่านี้เป็นข้อกำหนดที่จำเป็นสำหรับการทำงานที่เสถียรของแอปพลิเคชัน Android เนื่องจากการจัดการการเปลี่ยนระหว่างเมธอดที่ไม่ถูกต้องนำไปสู่การรั่วไหลของหน่วยความจำ การสูญเสียข้อมูลผู้ใช้ และการหยุดทำงานที่ไม่คาดคิด อ่านเพิ่มเติมเกี่ยวกับสถาปัตยกรรม Android ได้ใน บทความทั่วไปเกี่ยวกับ Android
ประเด็นสำคัญ
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) การทำความเข้าใจสามระดับนี้ช่วยกระจายโค้ดการเริ่มต้นและการปล่อยทรัพยากรอย่างถูกต้อง
แต่ละเมธอดของวงจรชีวิตทำงานที่กำหนดอย่างเคร่งครัด ระบบเรียกตามลำดับที่แน่นอน และนักพัฒนาควรโอเวอร์ไรด์เฉพาะเมธอดที่จำเป็นสำหรับตรรกะเฉพาะเท่านั้น ไม่แนะนำให้เรียกเมธอดวงจรชีวิตโดยตรง — Android Runtime จัดการเรื่องนี้
ลำดับทั่วไปเมื่อเปิดแอปพลิเคชัน: onCreate → onStart → onResume เมื่อกดปุ่มย้อนกลับ: onPause → onStop → onDestroy เมื่อย่อ: onPause → onStop จากนั้นเมื่อกลับมา: onRestart → onStart → onResume
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 ระบบเรียกหนึ่งครั้งเมื่อสร้างอินสแตนซ์ Activity เมธอดนี้รับพารามิเตอร์ savedInstanceState: Bundle? ซึ่งมีสถานะที่บันทึกไว้ก่อนหน้านี้หาก Activity ถูกสร้างใหม่หลังการทำลาย — ตัวอย่างเช่น เมื่อหมุนหน้าจอ
ภายใน onCreate ดำเนินการงานต่อไปนี้: การเริ่มต้นส่วนติดต่อผู้ใช้ผ่าน setContentView() ด้วยทรัพยากรเลย์เอาต์ การผูกองค์ประกอบ View ผ่าน findViewById() การตั้งค่าอะแดปเตอร์สำหรับ RecyclerView และ ViewPager การกู้คืนสถานะจาก savedInstanceState การเริ่มต้น ViewModel และ LiveData การตั้งค่าตัวฟังคลิกและท่าทาง เมธอดควรเสร็จสิ้นโดยเร็วที่สุด — การดำเนินการที่ยาวนานที่นี่บล็อกการเรนเดอร์เฟรมแรก ซึ่งเพิ่มเวลาเริ่มต้นแอปพลิเคชัน
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() ถูกเรียกทันทีหลังจาก onCreate() หรือหลังจาก onRestart() เมื่อ Activity ปรากฏให้ผู้ใช้เห็น ในสถานะนี้ Activity ยังไม่อยู่เบื้องหน้าและไม่สามารถโต้ตอบกับผู้ใช้ได้ แต่ส่วนติดต่อผู้ใช้ของมันปรากฏบนหน้าจอแล้ว ตัวอย่างเช่น เมื่อเปิดแอปพลิเคชัน ระบบจะเรนเดอร์เฟรมแรกของส่วนติดต่อระหว่างการเรียก onStart และ onResume
ในเมธอด onStart มักดำเนินการต่อไปนี้: เริ่มแอนิเมชันที่ควรทำงานขณะที่ Activity มองเห็นได้; ผูก BroadcastReceiver; เชื่อมต่อกับบริการระบุตำแหน่งและเซ็นเซอร์; อัปเดตข้อมูลจาก ViewModel หรือ Room การผูกกับ Bound services ผ่าน bindService() ก็ดำเนินการที่นี่หากแอปพลิเคชันใช้สถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ภายในกระบวนการ
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() — สถานะที่ Activity อยู่เบื้องหน้าและพร้อมโต้ตอบกับผู้ใช้ นี่คือสถานะการทำงานของหน้าจอ: ระบบถ่ายโอนโฟกัสอินพุตไปยัง Activity และเหตุการณ์สัมผัส การป้อนคีย์บอร์ด และท่าทางทั้งหมดถูกส่งไปยังหน้าจอนี้ เมธอด onResume ถูกเรียกทุกครั้งที่ Activity กลับมาเบื้องหน้า — หลังจาก Activity อื่นเสร็จสิ้น หลังจากปิดกล่องโต้ตอบ หรือหลังจากปลดล็อกอุปกรณ์
ใน onResume ดำเนินการ: การเริ่มแอนิเมชันต่อที่หยุดชั่วคราวใน onPause; การเปิดกล้องและทรัพยากรพิเศษอื่น ๆ; การลงทะเบียนตัวฟังเซ็นเซอร์ (มาตรวัดความเร่ง, ไจโรสโคป); การเริ่มตัวจับเวลาและนาฬิกาจับเวลาสำหรับ UI; การอัปเดตเนื้อหาหน้าจอด้วยข้อมูลปัจจุบัน คู่ onResume/onPause ใช้สำหรับทรัพยากรที่ควรทำงานเมื่อมีโฟกัสเท่านั้น — ตัวอย่างเช่น การรู้จำเสียงอย่างต่อเนื่องหรือการบันทึกวิดีโอ
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() ถูกเรียกเมื่อ Activity สูญเสียโฟกัสอินพุต แต่ยังคงมองเห็นได้บางส่วน สถานการณ์ทั่วไป: การเปิดกล่องโต้ตอบ การกดปุ่มแอปล่าสุด การเรียกเข้า การกดปุ่มโฮม (ในกรณีนี้ onPause จะตามด้วย onStop) เมธอด onPause เป็นตำแหน่งที่เชื่อถือได้สุดท้ายในการบันทึกข้อมูลที่ผู้ใช้ไม่ควรสูญเสีย
ใน onPause ดำเนินการ: การบันทึกร่างอีเมลและแบบฟอร์มป้อนข้อมูลใน Room หรือ SharedPreferences; การหยุดแอนิเมชันและการเล่นวิดีโอ; การปิดกล้องและการปล่อยทรัพยากรพิเศษ; การยกเลิกการดำเนินการที่มีค่าใช้จ่ายสูงที่ไม่สำคัญในพื้นหลัง เมธอด onPause ควรเสร็จสิ้นใน น้อยกว่า 100 มิลลิวินาที — ระบบบล็อกการเปลี่ยนไปยัง Activity ถัดไปจนกว่า onPause จะคืนการควบคุม และการเกินขีดจำกัดนำไปสู่ ANR (Application Not Responding)
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() ถูกเรียกเมื่อ Activity หยุดปรากฏให้ผู้ใช้เห็น สิ่งนี้เกิดขึ้นในกรณีต่อไปนี้: Activity ถูกบังทั้งหมดโดย Activity อื่น; ผู้ใช้กดปุ่มโฮมหรือสลับไปยังแอปพลิเคชันอื่น; Activity กำลังสิ้นสุด (จากนั้น onDestroy จะถูกเรียก) ในสถานะ onStop Activity ยังคงอยู่ในหน่วยความจำและคงฟิลด์ทั้งหมดไว้ — มันไม่ถูกทำลาย แต่ก็ไม่ทำงาน
ใน onStop ดำเนินการ: การยกเลิกการลงทะเบียน BroadcastReceiver ที่ลงทะเบียนใน onStart; การตัดการเชื่อมต่อจาก Bound services; การปล่อย LocationListener, SensorListener และตัวฟังระบบอื่น ๆ; การหยุดการดำเนินการพื้นหลังระยะยาวที่ไม่จำเป็นเมื่อแอปพลิเคชันถูกซ่อน; การเขียนสถานะ UI ปัจจุบันลงใน Bundle ผ่าน onSaveInstanceState() หากยังไม่ได้ทำใน onPause
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 สิ้นสุดผ่าน finish() หรือผู้ใช้กดปุ่มย้อนกลับ; Activity ถูกทำลายโดยระบบเนื่องจากการเปลี่ยนการกำหนดค่า (เช่น หมุนหน้าจอ) และจะถูกสร้างใหม่ เมธอด onDestroy อนุญาตให้ทำความสะอาดทรัพยากรครั้งสุดท้าย: การปลดเธรดและ coroutines การปิดเคอร์เซอร์และซ็อกเก็ตที่เปิดถาวร การปล่อยหน่วยความจำเนทีฟผ่าน NDK
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() ถูกเรียกก่อน onStart() เมื่อ Activity กลับจากสถานะหยุด (onStop) กลับมาเบื้องหน้า สิ่งนี้เกิดขึ้นเมื่อผู้ใช้เปิดแอปพลิเคชันอีกครั้งจากเมนูแอปล่าสุด หรือกลับไปยัง Activity โดยกดย้อนกลับบนหน้าจอย่อย เมธอด onRestart อนุญาตให้ดำเนินการตรรกะที่แตกต่างจาก onCreate — ตัวอย่างเช่น อัปเดตข้อมูลที่อาจเปลี่ยนแปลงขณะที่ Activity ถูกซ่อน
override fun onRestart() {
super.onRestart()
refreshDataFromNetwork()
Log.d("Lifecycle", "Activity กำลังเริ่มต้นใหม่จากสแต็ก")
}
สถานการณ์ทั่วไป: ผู้ใช้เปิดแอปพลิเคชัน สลับไปงานอื่น และกลับมาหนึ่งชั่วโมงต่อมา ใน onRestart แอปพลิเคชันสามารถตรวจสอบความเกี่ยวข้องของข้อมูล และหากเวลาผ่านไปมาก ก็แนะนำให้โหลดเนื้อหาใหม่ สิ่งนี้ปรับปรุงประสบการณ์ผู้ใช้และลดโอกาสในการแสดงข้อมูลที่ล้าสมัย
การหมุนหน้าจอเป็นสถานการณ์ที่พบบ่อยที่สุดสำหรับการสร้าง Activity ใหม่ โดยค่าเริ่มต้น Android จะทำลาย Activity ปัจจุบันและสร้างใหม่ทุกครั้งที่เปลี่ยนการวางแนว หากไม่บันทึกสถานะ ผู้ใช้จะสูญเสียข้อมูลที่ป้อนทั้งหมด Android มีสองกลไกสำหรับสิ่งนี้: onSaveInstanceState() สำหรับข้อมูลที่ซีเรียลไลซ์ได้ และ ViewModel สำหรับข้อมูลที่อยู่รอดการเปลี่ยนการกำหนดค่า
onSaveInstanceState() ถูกเรียกก่อนการทำลาย Activity เพื่อบันทึกสถานะชั่วคราว ข้อมูลที่บันทึกถูกส่งไปยัง onCreate ผ่านพารามิเตอร์ savedInstanceState และไปยังเมธอด onRestoreInstanceState() ซึ่งเรียกหลัง onStart Bundle มีขีดจำกัดขนาด — ประมาณ 500 KB ดังนั้นข้อมูลปริมาณมาก (เช่น บิตแมป) จะถูกบันทึกผ่าน ViewModel
<!-- AndroidManifest.xml — การตรึงการวางแนว -->
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize" />
การตรึงการวางแนวผ่าน android:configChanges ป้องกันการสร้าง Activity ใหม่ แต่ถือเป็นปฏิยานุกรมหากแอปพลิเคชันต้องรองรับทั้งสองการวางแนว คำแนะนำสมัยใหม่ของ Google คือการใช้ ViewModel ร่วมกับ onSaveInstanceState สำหรับข้อมูลที่ผู้ใช้ป้อนใน UI
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
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 — คอมโพเนนต์ของไลบรารี Android Jetpack ที่ช่วยให้ตอบสนองต่อการเปลี่ยนแปลงวงจรชีวิตโดยไม่ต้องโอเวอร์ไรด์เมธอดใน Activity หรือ Fragment แทนที่จะทำซ้ำโค้ดในทุกเมธอดวงจรชีวิต นักพัฒนาสร้างคลาสแยกต่างหากด้วยคำอธิบายประกอบ @OnLifecycleEvent และส่งต่อไปยัง lifecycle.addObserver()
Jetpack ยังมีอินเทอร์เฟซ LifecycleOwner ซึ่ง AppCompatActivity และ Fragment เป็นผู้ดำเนินการ วัตถุใด ๆ ที่ดำเนินการ LifecycleOwner สามารถจัดการการสมัครรับ LiveData, coroutines ผ่าน lifecycleScope และ WorkManager ที่เกี่ยวข้องกับวงจรชีวิต นี่คือรากฐานของสถาปัตยกรรม Android สมัยใหม่ที่ใช้ MVVM และ Jetpack
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.onCreate() หรือเมธอด super วงจรชีวิตอื่น ๆ ระบบจะโยนข้อยกเว้น SuperNotCalledException และแอปพลิเคชันจะหยุดทำงาน นี่เป็นข้อกำหนดที่เข้มงวดของ Android Runtime — แต่ละเมธอดต้องมอบหมายการดำเนินการให้กับคลาสพื้นฐาน มิฉะนั้นเครื่องสถานะภายในจะไม่สามารถเปลี่ยนไปยังสถานะถัดไปได้
Activity ถูกสร้างใหม่เมื่อหมุนหน้าจอเพราะ การเปลี่ยนการวางแนวคือการเปลี่ยนการกำหนดค่าอุปกรณ์ โดยค่าเริ่มต้น Android จะทำลาย Activity และสร้างใหม่เพื่อโหลดทรัพยากรทางเลือก (layout-land, values-land) เพื่อปิดการสร้างใหม่ สามารถเพิ่มแอตทริบิวต์ android:configChanges ในแมนิเฟสต์ แต่ Google แนะนำให้ใช้ ViewModel เพื่อรักษาข้อมูล
ข้อมูลสำคัญจะถูกบันทึกใน onPause() เนื่องจากนี่เป็นเมธอดสุดท้ายที่รับประกันว่าจะถูกเรียกก่อนที่แอปพลิเคชันจะถูกฆ่าโดยระบบ หลังจาก onStop และ onDestroy ระบบสามารถสิ้นสุดกระบวนการโดยไม่เรียกเมธอดเพิ่มเติม สำหรับร่างและข้อมูลระหว่างกลาง ให้ใช้ SharedPreferences กับ apply() หรือ Room กับ coroutines
onPause ถูกเรียกเมื่อ Activity สูญเสียโฟกัสแต่ยังคงมองเห็นได้บางส่วน (เช่น เปิดกล่องโต้ตอบ) onStop ถูกเรียกเมื่อ Activity ถูกซ่อนจากหน้าจออย่างสมบูรณ์โดย Activity อื่นหรือโดยการกดปุ่มโฮม ความแตกต่างในทางปฏิบัติหลัก: onPause เป็นจุดสุดท้ายสำหรับการบันทึกข้อมูล onStop เป็นสถานที่สำหรับปล่อยตัวฟังและบริการระบบที่ไม่จำเป็นในพื้นหลัง
ViewModel คือคอมโพเนนต์ Android Jetpack ที่เก็บข้อมูล UI และอยู่รอดการเปลี่ยนการกำหนดค่า (การหมุนหน้าจอ) โดยอัตโนมัติ ViewModel จะไม่ถูกทำลายเมื่อ Activity ถูกสร้างใหม่: มันมีชีวิตอยู่จนกว่า LifecycleOwner (Activity หรือ Fragment) จะสิ้นสุดอย่างสมบูรณ์ สิ่งนี้แก้ปัญหาการรักษาข้อมูลระหว่างการหมุนหน้าจอโดยไม่ต้องใช้ Bundle และ onSaveInstanceState ViewModel เป็นองค์ประกอบบังคับของสถาปัตยกรรม MVVM ที่ Google แนะนำ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ