Activity — คอมโพเนนต์พื้นฐานของแอปพลิเคชัน Android ที่แสดงหน้าจอเดียวพร้อมอินเทอร์เฟซผู้ใช้ ระบบจัดการหน้าจอผ่านวงจรชีวิตที่เข้มงวด — คอลแบ็ก onCreate, onResume และ onDestroy แต่ละ Activity ถูกประกาศใน AndroidManifest.xml และเริ่มต้นผ่าน Intent อ่านเพิ่มเติมเกี่ยวกับประวัติของ Android ได้ใน เอกสารอย่างเป็นทางการของ Google
ประเด็นสำคัญ
Activity — คอมโพเนนต์หลักของแอปพลิเคชัน Android ที่ให้หน้าต่างสำหรับการโต้ตอบกับผู้ใช้ แต่ละ Activity จัดการหน้าจอแยกต่างหาก: รายการงาน, ฟอร์มเข้าสู่ระบบ, ตัวดูรูปภาพ ระบบ Android สร้าง Activity เมื่อมีการร้องขอและทำลายเมื่อแอปพลิเคชันอื่นต้องการหน่วยความจำ
Activity ปรากฏครั้งแรกใน Android 1.0 (2008) และยังคงเป็นบล็อกการสร้างหลักของอินเทอร์เฟซ ตามข้อมูลของ Google (2026) 98% ของแอปบน Google Play มี Activity อย่างน้อยหนึ่งรายการ ในสถาปัตยกรรมสมัยใหม่ Google แนะนำให้ใช้ Activity หนึ่งรายการกับ Fragment หลายรายการ อย่างไรก็ตามแอปพลิเคชันหลายหน้าจอแบบคลาสสิกยังคงเป็นแนวปฏิบัติทั่วไป
Activity stack (back stack) — สแต็กงานที่เก็บประวัติการนำทาง เมื่อผู้ใช้กด "กลับ" Activity ปัจจุบันจะถูกทำลายและ Activity ก่อนหน้าจะถูกกู้คืน ระบบจัดการสแต็กโดยอัตโนมัติ แต่ผู้พัฒนาสามารถควบคุมพฤติกรรมผ่าน launchMode และแฟล็ก Intent
วงจรชีวิตของ Activity คือชุดของสถานะและคอลแบ็กที่หน้าจอต้องผ่านตั้งแต่การสร้างจนถึงการทำลาย การทำความเข้าใจ Lifecycle มีความสำคัญอย่างยิ่ง: การจัดการสถานะที่ไม่ถูกต้องนำไปสู่การรั่วไหลของหน่วยความจำ การสูญเสียข้อมูล และแอปขัดข้อง
ระบบ Android เรียกคอลแบ็กตามลำดับที่เข้มงวด ผู้พัฒนาเขียนทับเมธอดที่จำเป็นเพื่อเริ่มต้นทรัพยากร บันทึกข้อมูล และปล่อยหน่วยความจำ แต่ละคอลแบ็กมีคู่ที่สอดคล้องกัน: onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause
| คอลแบ็ก | วัตถุประสงค์ | การกระทำของผู้พัฒนา |
|---|---|---|
| onCreate | ถูกเรียกเมื่อสร้าง Activity | การเริ่มต้น UI, การสมัครรับ ViewModel |
| onStart | Activity มองเห็นได้ | เริ่มแอนิเมชัน, กล้อง, GPS |
| onResume | Activity ได้รับโฟกัสอินพุต | เล่นวิดีโอต่อ, ตัวจับเวลา |
| onPause | Activity สูญเสียโฟกัส | บันทึกร่าง, หยุดแอนิเมชัน |
| onStop | Activity ถูกซ่อนโดยหน้าจออื่น | ปล่อยทรัพยากรหนัก |
| onDestroy | Activity ถูกทำลาย | ล้างการสมัครรับ, Closeable |
มีสี่สถานะของ Activity: Running (onResume ทำงานอยู่), Paused (มองเห็นได้แต่ไม่มีโฟกัส), Stopped (ไม่มองเห็น), Destroyed (ถูกทำลาย) ระบบสามารถฆ่า Activity ในสถานะ Stopped เมื่อหน่วยความจำไม่เพียงพอ — ข้อมูลต้องถูกบันทึกใน onSaveInstanceState
มาดูสามเมธอดหลักของ วงจรชีวิต Activity พร้อมตัวอย่าง Kotlin onCreate — จุดเริ่มต้น ถูกเรียกครั้งเดียว ที่นี่การผูกเลย์เอาต์ผ่าน setContentView, การเริ่มต้น RecyclerView, การสมัครรับ LiveData เกิดขึ้น onStart — Activity มองเห็นได้ต่อผู้ใช้ onResume — Activity ได้รับโฟกัสและพร้อมสำหรับการโต้ตอบ
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
recyclerView.layoutManager = LinearLayoutManager(this)
loadItems()
}
override fun onStart() {
super.onStart()
startLocationUpdates()
}
override fun onResume() {
super.onResume()
resumeVideoPlayer()
}
}ในตัวอย่าง onCreate เริ่มต้น RecyclerView และโหลดข้อมูล onStart เริ่มการอัปเดตตำแหน่งทางภูมิศาสตร์ — ทรัพยากรที่ควรทำงานเมื่อหน้าจอมองเห็นเท่านั้น onResume เล่นวิดีโอต่อที่ถูกหยุดใน onPause การแยกนี้ป้องกันการทำงานพื้นหลังที่ไม่จำเป็น
แต่ละ Activity ต้องถูกประกาศในไฟล์ AndroidManifest.xml หากไม่ลงทะเบียน ระบบจะไม่พบหน้าจอและจะโยนข้อยกเว้น ActivityNotFoundException ไฟล์แถลงการณ์ระบุชื่อคลาส ชุดรูปแบบ การวางแนว launchMode และตัวกรอง Intent
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity" />
</application>แฟล็ก exported กำหนดว่าแอปพลิเคชันอื่นสามารถเริ่ม Activity ได้หรือไม่ สำหรับหน้าจอหลัก exported=true สำหรับหน้าจอภายใน — false คุณลักษณะ parentActivityName เปิดใช้งานการนำทาง "ขึ้น" มาตรฐาน (Up Navigation)
Intent — ออบเจ็กต์ที่อธิบายการดำเนินการที่ต้องดำเนินการ ในบริบทของ Activity Intent ใช้เพื่อเริ่มหน้าจออื่นพร้อมการส่งข้อมูล Intent สามารถเป็นแบบชัดแจ้ง (ระบุคลาสเฉพาะ) และแบบโดยนัย (ระบุการดำเนินการ ระบบเลือกคอมโพเนนต์ที่เหมาะสม)
// Intent ชัดแจ้ง — เริ่ม DetailActivity ด้วยข้อมูล
val intent = Intent(this, DetailActivity::class.java).apply {
putExtra("item_id", itemId)
putExtra("item_name", itemName)
}
startActivity(intent)
// รับข้อมูลใน DetailActivity
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""เพื่อรับผลลัพธ์จาก Activity ที่เริ่มต้น Activity Result API ถูกใช้ ซึ่งแทนที่ startActivityForResult ที่เลิกใช้แล้ว API ใหม่ปลอดภัยด้านชนิด ประกาศ และทำงานกับ Jetpack Compose
private val getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data?.getStringExtra("result_key")
}
}
fun openPicker() {
val intent = Intent(this, PickerActivity::class.java)
getResult.launch(intent)
}เมื่อหมุนหน้าจอหรือเปลี่ยนการกำหนดค่า Android สร้าง Activity ใหม่ — เรียก onDestroy และ onCreate ตามลำดับ หากไม่บันทึกสถานะ ผู้ใช้จะสูญเสียข้อมูลที่ป้อน ตำแหน่งเลื่อน และรายการที่เลือก Android มีสองกลไกในการแก้ปัญหานี้: onSaveInstanceState และ ViewModel
onSaveInstanceState บันทึกข้อมูลอย่างง่ายใน Bundle ก่อนเรียก onDestroy ViewModel จาก Jetpack ทนต่อการสร้าง Activity ใหม่และเก็บข้อมูลในหน่วยความจำ ซึ่งมีประสิทธิภาพมากกว่าสำหรับออบเจ็กต์ที่ซับซ้อนและคำขอเครือข่าย
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModel บันทึกข้อมูลโดยอัตโนมัติ
viewModel.items.observe(this) { items ->
updateAdapter(items)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
}
}แนวทางสมัยใหม่ของ Google คือ สถาปัตยกรรม Single Activity ที่มี Activity หนึ่งรายการและ Fragment หลายรายการ แอปใช้ MainActivity หนึ่งรายการและการนำทางทั้งหมดจัดการโดย Navigation Component ผ่าน NavHostFragment ข้อดี: การนำทางแบบรวมศูนย์, ViewModel ที่ใช้ร่วมกันต่อหน้าจอ, การจัดการ Deep Links ที่ถูกต้อง
Jetpack Navigation Component จัดการ back stack อัตโนมัติ, แอนิเมชันการเปลี่ยนภาพ และการส่งอาร์กิวเมนต์ NavHostFragment ถูกวางในเลย์เอาต์ของ Activity และกราฟการนำทาง (NavGraph) อธิบายหน้าจอทั้งหมดและการเชื่อมต่อระหว่างกัน แนวทางนี้ได้รับการแนะนำโดย Google สำหรับโปรเจกต์ใหม่และปฏิบัติตามหลักการ Material Design
class MainActivity : AppCompatActivity() {
private val navController by lazy {
findViewById<NavHostFragment>(R.id.nav_host_fragment)
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// การตั้งค่า NavigationUI สำหรับ AppBar
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}คำถามที่พบบ่อย
Activity — หน้าจอแอปพลิเคชันที่สมบูรณ์พร้อมวงจรชีวิตของตัวเอง Fragment — ส่วนหนึ่งของ UI ภายใน Activity ที่ทนต่อการสร้าง Activity ใหม่และขึ้นอยู่กับ Lifecycle ของมัน Activity เป็นข้อบังคับ Fragment เป็นทางเลือก
ไม่มีข้อจำกัด แต่ละหน้าจอมักจะแสดง Activity แยกต่างหาก สำหรับแอปง่าย ๆ แค่รายการเดียวก็เพียงพอ สำหรับแอปหลายหน้าจอ — 5 ถึง 20 Google แนะนำ Activity หนึ่งรายการกับ Fragment หลายรายการ
launchMode กำหนดว่า Activity ถูกสร้างในสแต็กงานอย่างไร สี่โหมด: standard (สร้างอินสแตนซ์ใหม่), singleTop, singleTask (หนึ่งอินสแตนซ์ต่องาน) และ singleInstance (งานแยก) โหมดถูกตั้งค่าใน AndroidManifest.xml
ผ่าน Intent — ออบเจ็กต์ที่มี extras (putExtra) ซึ่งสามารถบรรจุชนิดดั้งเดิม, สตริง, Parcelable หรือ Serializable สำหรับการสื่อสารตอบกลับ ใช้ Activity Result API — ตัวแทนที่ปลอดภัยด้านชนิดที่ทันสมัยของ startActivityForResult
Configuration Change — การสร้าง Activity ใหม่เมื่อเปลี่ยนการกำหนดค่า (หมุนหน้าจอ, เปลี่ยนภาษา, แป้นพิมพ์) ระบบเรียก onDestroy → onCreate หากต้องการบันทึกข้อมูล ให้ใช้ onSaveInstanceState หรือ ViewModel จาก Jetpack
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ