App Lifecycle: คืออะไร สถานะของแอปใน iOS และ Android

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-03-02 เวลาอ่าน: 8 นาที
App Lifecycle (วงจรชีวิตของแอปพลิเคชัน) คือลำดับของสถานะที่แอปมือถือต้องผ่านตั้งแต่เริ่มต้นจนสิ้นสุด การทำความเข้าใจวงจรชีวิตเป็นสิ่งสำคัญสำหรับการจัดการทรัพยากร การคงข้อมูล และการรับประกันความเสถียร ใน iOS แอปจะผ่านสถานะ: Not Running → Active → Inactive → Background → Suspended ใน Android — ผ่าน onCreate → onStart → onResume → onPause → onStop → onDestroy + onRestart แต่ละสถานะให้โอกาสนักพัฒนาในการบันทึกสถานะ ปลดปล่อยทรัพยากร หรือเตรียมพร้อมสำหรับการกลับมา ตามเอกสารของ Apple การละเลยเหตุการณ์วงจรชีวิตเป็นสาเหตุของ 40 % ของการขัดข้องเมื่อย่อแอป ที่ IT Sectr เราได้นำ ProcessLifecycleOwner ใน Android และรูปแบบ AppDelegate ใน iOS มาใช้เป็นมาตรฐานบังคับสำหรับทุกโครงการ — ซึ่งลดข้อผิดพลาดที่เกี่ยวข้องกับพื้นหลังลง 60 %

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

  • App Lifecycle — ชุดของสถานะแอปตั้งแต่เริ่มต้นจนสิ้นสุด แต่ละสถานะมีการกระทำของนักพัฒนาเฉพาะ
  • AppDelegate — คลาสหลักของ iOS สำหรับการจัดการวงจรชีวิต: didFinishLaunching, didEnterBackground, willEnterForeground
  • SceneDelegate — ตัวแทนสำหรับฉากแต่ละฉาก (iOS 13+) จัดการวงจรชีวิตของแต่ละหน้าต่างในแอปหลายหน้าต่าง
  • ProcessLifecycleOwner — คอมโพเนนต์ Android จาก AndroidX Lifecycle ที่ติดตามวงจรชีวิตของทั้งกระบวนการ
  • Application.onCreate — จุดเข้าสู่แรกของแอปพลิเคชัน Android ถูกเรียกก่อน Activity ใด ๆ

App Lifecycle คืออะไร?

App Lifecycle คือเครื่องจักรสถานะจำกัดที่อธิบายสถานะที่เป็นไปได้ทั้งหมดของแอปพลิเคชันมือถือและการเปลี่ยนแปลงระหว่างสถานะเหล่านั้น แต่ละสถานะกำหนดว่าแอปสามารถเรียกใช้โค้ด แสดงส่วนติดต่อผู้ใช้ และใช้ทรัพยากรได้หรือไม่ iOS และ Android มีโมเดลที่คล้ายกันแต่ไม่เหมือนกัน — ความแตกต่างเกิดจากสถาปัตยกรรมระบบปฏิบัติการ: iOS ใช้การควบคุมหน่วยความจำที่เข้มงวด (สถานะ suspended) ในขณะที่ Android ใช้การจัดการกระบวนการที่ยืดหยุ่นผ่าน onSaveInstanceState

ใน iOS วงจรชีวิตเชื่อมโยงอย่างแน่นหนากับเบื้องหน้า/เบื้องหลัง: แอปจะทำงานหรือถูกระงับ ใน Android วงจรชีวิตมีความละเอียดมากขึ้น — Activity/หน้าต่างผ่าน 6+ สถานะ และกระบวนการเองมีวงจรชีวิตเพิ่มเติมผ่าน ProcessLifecycleOwner แอปพลิเคชันสมัยใหม่ (ตั้งแต่ปี 2024) ใช้รูปแบบสถาปัตยกรรมที่อิงตามวงจรชีวิตมากขึ้น: SwiftUI Lifecycle (iOS 16+) ผ่านสภาพแวดล้อม .scenePhase, Compose Lifecycle ผ่าน LifecycleEventObserver รูปแบบเหล่านี้จัดการการสลับบริบทโดยอัตโนมัติและป้องกันหน่วยความจำรั่วไหล ตามข้อมูลของ Google การจัดการวงจรชีวิตที่ถูกต้องใน Android ลดการใช้หน่วยความจำลง 30–40 % ระหว่างการทำงานเบื้องหลัง

วงจรชีวิต iOS: AppDelegate และ SceneDelegate

ใน iOS วงจรชีวิตแอปถูกจัดการผ่านคลาส UIApplicationDelegate (AppDelegate) วิธีการหลัก: application(_:didFinishLaunchingWithOptions:) — การเริ่มต้นเมื่อเปิดครั้งแรก; applicationDidBecomeActive — แอปปรากฏและพร้อมสำหรับการโต้ตอบ; applicationWillResignActive — การเปลี่ยนไปสู่สถานะไม่ทำงาน (สายเรียกเข้า การปิดแผงการแจ้งเตือน); applicationDidEnterBackground — แอปถูกซ่อน มีประมาณ 5 วินาทีในการบันทึกข้อมูล; applicationWillEnterForeground — การกลับมาจากเบื้องหลัง; applicationWillTerminate — การสิ้นสุด (เรียกเฉพาะสำหรับแอปเก่าที่ไม่มี suspended)

เริ่มต้นจาก iOS 13 Apple ได้แนะนำ SceneDelegate (UISceneDelegate) เพื่อรองรับแอปพลิเคชันหลายหน้าต่างบน iPad และ macOS Catalyst SceneDelegate จัดการวงจรชีวิตของแต่ละฉาก (หน้าต่าง) แต่ละฉาก: scene(_:willConnectTo:options:) — การสร้างฉาก; sceneDidBecomeActive — ฉากทำงาน; sceneWillResignActive — ฉากสูญเสียโฟกัส; sceneDidEnterBackground — ฉากถูกซ่อน AppDelegate จัดการเหตุการณ์ระดับโลก (การโหลดข้อมูล การแจ้งเตือนแบบพุช) ในขณะที่ SceneDelegate จัดการสถานะส่วนติดต่อผู้ใช้ของแต่ละหน้าต่าง ใน SwiftUI วงจรชีวิตถูกจัดการผ่านค่าสภาพแวดล้อม @Environment(\.scenePhase): .active, .inactive, .background — ซึ่งให้ API ที่เป็นหนึ่งเดียวสำหรับทั้งแอป SwiftUI และ UIKit

วงจรชีวิต Android: Application และ ProcessLifecycleOwner

ใน Android วงจรชีวิตเริ่มต้นด้วยคลาส Application — ซิงเกิลตันที่สร้างก่อน Activity ใด ๆ วิธี Application.onCreate() เป็นจุดเข้าสู่แรก ใช้สำหรับการเริ่มต้นระดับโลก (Analytics, DI, Crash Reporting) หลังจากนั้น Activity จะเริ่มทำงานตามลำดับ: onCreate() → onStart() → onResume() เมื่อย่อ: onPause() → onStop() → onSaveInstanceState() เมื่อถูกทำลาย: onDestroy() เมื่อกลับมา: onRestart() → onStart() → onResume()

ProcessLifecycleOwner (จาก AndroidX Lifecycle 2.2+) ติดตามวงจรชีวิตของทั้งกระบวนการ ไม่ใช่ Activity แต่ละตัว มันให้สองสถานะ: ON_RESUME (แอปอยู่ในเบื้องหน้า) และ ON_STOP (แอปถูกซ่อน) ProcessLifecycleOwner แก้ปัญหา “เมื่อใดที่แอปไปที่เบื้องหลัง” ในระดับกระบวนการ — ซึ่งสำคัญสำหรับ SDK, ไลบรารี และแอปพลิเคชันแบบโมดูลาร์ ใน Jetpack Compose วงจรชีวิตถูกจัดการผ่าน LifecycleEventObserver และ collectAsStateWithLifecycle ซึ่งระงับการรวบรวมข้อมูลโดยอัตโนมัติในโหมดเบื้องหลัง Android 14 (API 34) เพิ่มการแจ้งเตือนวงจรชีวิตบริการเบื้องหน้าผ่าน Service.onTimeout — บริการต้องเสร็จภายใน 6 ชั่วโมง มิฉะนั้นระบบจะหยุดโดยบังคับ

การเปรียบเทียบวงจรชีวิต iOS และ Android

iOS Android คำอธิบาย
Not Running แอปยังไม่ได้เริ่มทำงาน
didFinishLaunching Application.onCreate การเริ่มต้นครั้งแรกเมื่อเปิด
Active onResume แอปปรากฏและรับอินพุต
Inactive onPause การสูญเสียโฟกัสชั่วคราว (สายเรียกเข้า แผงการแจ้งเตือน)
Background onStop แอปถูกซ่อน โค้ดอาจทำงาน
Suspended โค้ดไม่ทำงาน หน่วยความจำถูกสงวน
Will Terminate onDestroy แอปกำลังสิ้นสุด

ความแตกต่างหลัก: iOS บังคับให้แอปเปลี่ยนเป็น Suspended (โค้ดหยุดทำงาน) 5-10 วินาทีหลังจากเข้าสู่เบื้องหลัง Android อนุญาตให้ทำงานเบื้องหลัง (บริการ, WorkManager) ในระยะเวลาที่ยาวนานกว่า แต่มีข้อจำกัดจากโหมด Doze (Android 6+) และข้อจำกัดเบื้องหลัง (Android 12+) ProcessLifecycleOwner ใน Android เทียบเท่ากับ UIApplicationDidEnterBackgroundNotification ใน iOS โดยมีความแตกต่างที่มันทำงานเมื่อมีการเปลี่ยนไปยังเบื้องหลังทุกครั้ง ไม่ใช่แค่หลังจากสูญเสียโฟกัส

ตัวอย่างโค้ด

iOS: AppDelegate พร้อมวิธีการวงจรชีวิต

การใช้งาน AppDelegate พื้นฐานที่จัดการสถานะวงจรชีวิตทั้งหมด การบันทึกข้อมูลเมื่อเปลี่ยนไปเบื้องหลังและการอัปเดตส่วนติดต่อผู้ใช้เมื่อกลับมา

swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        Analytics.shared.initialize()
        return true
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        NotificationCenter.default.post(name: .appDidBecomeActive, object: nil)
    }

    func applicationWillResignActive(_ application: UIApplication) {
        NotificationCenter.default.post(name: .appWillResignActive, object: nil)
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        CoreDataManager.shared.saveContext()
        UserDefaults.standard.synchronize()
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        NetworkManager.shared.refreshSession()
    }
}

AppDelegate เป็นจุดศูนย์กลางของวงจรชีวิต applicationDidEnterBackground เป็นวิธีการสำคัญ: iOS ให้เวลา ~5 วินาทีในการบันทึก applicationDidBecomeActive — อัปเดตส่วนติดต่อผู้ใช้ เริ่มต้นแอนิเมชันใหม่ สำหรับ SceneDelegate (iOS 13+) ตรรกะวงจรชีวิตจะกระจายไปยังฉาก: sceneDidBecomeActive / sceneDidEnterBackground จัดการหน้าต่างแต่ละหน้าต่าง

iOS: SceneDelegate (iOS 13+)

SceneDelegate สำหรับแอปพลิเคชัน iPad หลายหน้าต่าง แต่ละฉากมีวงจรชีวิตของตัวเอง เป็นอิสระจากหน้าต่างอื่น

swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(
        _ scene: UIScene,
        willConnectTo session: UISceneSession,
        options connectionOptions: UIScene.ConnectionOptions
    ) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(windowScene: windowScene)
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        PlayerManager.shared.resume()
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        PlayerManager.shared.pause()
        CoreDataManager.shared.saveContext()
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        PlayerManager.shared.cleanup()
    }
}

SceneDelegate จัดการวงจรชีวิตของฉากแต่ละฉาก sceneDidBecomeActive / sceneDidEnterBackground เป็นวิธีการที่เทียบเท่ากับ AppDelegate สำหรับหน้าต่างเฉพาะ sceneDidDisconnect จะถูกเรียกเมื่อฉากถูกปิด (ผู้ใช้ปิดหน้าต่างบน iPad) สำหรับความเข้ากันได้กับ iOS 12 และต่ำกว่า AppDelegate ต้องทำซ้ำตรรกะของ SceneDelegate ใน iOS 17+ คุณสามารถใช้ @Observable เพื่อหยุด/เริ่มงานใหม่โดยอัตโนมัติตาม scenePhase

Android: Application กับ ProcessLifecycleOwner

ProcessLifecycleOwner ติดตามว่าแอปอยู่ในเบื้องหน้า/เบื้องหลังในระดับกระบวนการ นี่เป็นแนวทางที่เหมาะสมที่สุดสำหรับการจัดการวงจรชีวิตระดับโลก

kotlin
import android.app.Application
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
    }
}

class AppLifecycleObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onEnterForeground() {
        Analytics.shared.onForeground()
        NetworkMonitor.shared.start()
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onEnterBackground() {
        Analytics.shared.onBackground()
        NetworkMonitor.shared.stop()
    }
}

ProcessLifecycleOwner เป็นวิธีที่ถูกต้องเพียงวิธีเดียวในการติดตามการเปลี่ยนไปยังเบื้องหลังในระดับแอปพลิเคชัน ON_START ทำงานเมื่อแอปปรากฏ (เบื้องหน้า) ON_STOP — เมื่อถูกซ่อนอย่างสมบูรณ์ (เบื้องหลัง) แตกต่างจากวงจรชีวิตของ Activity ตรงที่ ProcessLifecycleOwner ไม่ผูกติดกับหน้าจอเฉพาะ สำหรับ Jetpack Compose ให้ใช้ LifecycleResumeEffect หรือ collectAsStateWithLifecycle แทนการสังเกตด้วยตนเอง

Android: วงจรชีวิต Activity กับ ViewModel

ViewModel + Lifecycle เป็นสถาปัตยกรรม Android ที่ถูกต้องสำหรับการจัดการวงจรชีวิต ViewModel จะถูกทำความสะอาดโดยอัตโนมัติเมื่อ onDestroy ป้องกันการรั่วไหล

kotlin
import androidx.lifecycle.ViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

class TimerViewModel : ViewModel() {

    private val _time = MutableLiveData<Long>()
    val time: LiveData<Long> = _time

    private var startTime = System.currentTimeMillis()

    init {
        updateTime()
    }

    private fun updateTime() {
        _time.value = System.currentTimeMillis() - startTime
    }

    override fun onCleared() {
        super.onCleared()
        Logger.d("ViewModel cleared — กำลังปลดปล่อยทรัพยากร")
    }
}

// ใน Activity
class TimerActivity : AppCompatActivity() {

    private val viewModel: TimerViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Logger.d("Activity created")
    }

    override fun onResume() {
        super.onResume()
        viewModel.time.observe(this) { Logger.d("Time: $it") }
    }

    override fun onPause() {
        super.onPause()
        Logger.d("Activity paused — กำลังหยุดแอนิเมชัน")
    }

    override fun onDestroy() {
        super.onDestroy()
        Logger.d("Activity destroyed — ทำความสะอาด")
    }
}

ViewModel อยู่รอดการหมุนหน้าจอและจะถูกทำลายเมื่อ Activity สิ้นสุดเท่านั้น onCleared() เป็นสถานที่สำหรับปลดปล่อยทรัพยากรและยกเลิกการสมัครรับข้อมูลสตรีม LiveData หยุดการสังเกตโดยอัตโนมัติเมื่อ onPause และเริ่มใหม่เมื่อ onResume — ซึ่งให้การป้องกันการรั่วไหลและการขัดข้องระหว่างการทำงานเบื้องหลัง ใน Compose ใช้ collectAsStateWithLifecycle() เพื่อจุดประสงค์เดียวกัน

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

เกิดอะไรขึ้นเมื่อผู้ใช้ย่อแอป iOS?

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

ฉันจำเป็นต้องจัดการทุกสถานะของ App Lifecycle หรือไม่?

ขั้นต่ำที่จำเป็น: applicationDidEnterBackground — บันทึกข้อมูลผู้ใช้; applicationWillEnterForeground — อัปเดตส่วนติดต่อผู้ใช้; ใน Android onPause — หยุดแอนิเมชัน/เซ็นเซอร์ชั่วคราว ProcessLifecycleOwner ทำให้การจัดการง่ายขึ้น: onResume — onPause สำหรับเบื้องหน้า, onStart — onStop สำหรับการมองเห็น จัดการสถานะอื่นตามความจำเป็น — ไม่ใช่ทุกสถานะที่สำคัญสำหรับทุกแอปพลิเคชัน

SceneDelegate แตกต่างจาก AppDelegate อย่างไร?

AppDelegate เป็นตัวแทนระดับโลกของทั้งแอปพลิเคชัน (การเริ่มต้น การเปลี่ยนไปยังเบื้องหลัง) SceneDelegate (iOS 13+) จัดการวงจรชีวิตของ หน้าต่างเฉพาะ (ฉาก) — ในแอปพลิเคชัน iPad หลายหน้าต่าง แต่ละฉากมีวงจรชีวิตของตัวเอง สำหรับ iOS 12 และต่ำกว่า วงจรชีวิตทั้งหมดถูกจัดการผ่าน AppDelegate ด้วย iPadOS 16+ จำเป็นต้องใช้ SceneDelegate สำหรับ Stage Manager

ProcessLifecycleOwner ใน Android คืออะไร?

ProcessLifecycleOwner เป็นคอมโพเนนต์จาก AndroidX Lifecycle ที่ติดตามวงจรชีวิตของทั้งแอปพลิเคชัน (กระบวนการ) ไม่ใช่ Activity แต่ละตัว มันให้สองเหตุการณ์หลัก: ON_RESUME (แอปในเบื้องหน้า) และ ON_STOP (แอปในเบื้องหลัง) ใช้สำหรับการเริ่มต้น/ทำความสะอาด SDK, การวิเคราะห์, ตัวตรวจสอบเครือข่าย — ทุกสิ่งที่ควรตอบสนองต่อการเปลี่ยนไปยังเบื้องหลังของแอป โดยไม่ขึ้นกับหน้าจอปัจจุบัน

จะจัดการวงจรชีวิตใน Jetpack Compose ได้อย่างไร?

ใน Jetpack Compose ให้ใช้ LifecycleEventObserver ผ่าน LocalLifecycleOwner.current.lifecycle หรือฟังก์ชัน collectAsStateWithLifecycle() สำหรับหน้าจอ Compose ให้ใช้ LifecycleResumeEffect — คล้ายกับ DisposableEffect ที่ทำงานเมื่อ onResume และทำความสะอาดเมื่อ onPause lifecycleScope.launchWhenResumed — โครูทีนที่ถูกระงับโดยอัตโนมัติในเบื้องหลัง

สรุป

  • App Lifecycle เป็นเครื่องจักรสถานะจำกัดที่กำหนดการจัดการทรัพยากร การคงข้อมูล และความเสถียร
  • iOS AppDelegate (applicationDidEnterBackground) เป็นวิธีการสำคัญสำหรับการบันทึกข้อมูลเมื่อเปลี่ยนไปเบื้องหลังภายใน 5 วินาที
  • iOS SceneDelegate (iOS 13+) จัดการวงจรชีวิตของแต่ละฉากแยกกัน — จำเป็นสำหรับแอปพลิเคชัน iPad หลายหน้าต่าง
  • Android ProcessLifecycleOwner เป็นผู้สังเกตการณ์วงจรชีวิตกระบวนการระดับโลกสำหรับการเริ่มต้น/ทำความสะอาด SDK
  • ViewModel ใน Android อยู่รอดการหมุนหน้าจอและถูกทำความสะอาดเมื่อ Activity สิ้นสุด — ป้องกันหน่วยความจำรั่วไหล
  • SwiftUI @Environment(\.scenePhase) ให้ API ที่เป็นหนึ่งเดียวสำหรับวงจรชีวิตใน SwiftUI (active, inactive, background)
  • การจัดการวงจรชีวิตที่ถูกต้องลดการใช้หน่วยความจำ 30-40% และป้องกัน 40% ของการขัดข้องระหว่างทำงานเบื้องหลัง

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

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

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

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