LifecycleOwner — bu nima, Jetpack interfeysi va hodisalarga obuna bo'lish

Muallif: IT Sectr Nashr etilgan: 2026-03-06 O'qish vaqti: 9 daq

LifecycleOwner — bu Android Jetpack kutubxonasidagi asosiy interfeys bo'lib, ob'ekt hayot siklini saqlashini e'lon qiladi va unga getLifecycle() metodi orqali kirishni ta'minlaydi. U zamonaviy Android ilovalarining komponent arxitekturasining asosida yotadi, hayot sikli bilan ishlash mantig'ini Activity yoki Fragmentning aniq amalga oshirilishidan ajratishga imkon beradi. Google I/O 2024 ma'lumotlariga ko'ra, Androiddagi yangi loyihalarning 85% dan ortig'i obunalarni boshqarish va xotira oqib ketishining oldini olish uchun LifecycleOwner-dan foydalanadi. Ushbu interfeys LiveData, ViewModel va boshqa Jetpack komponentlari uchun poydevor bo'lib, kodning faqat komponent faol holatda xavfsiz bajarilishini ta'minlaydi.

Asosiy fikrlar

  • LifecycleOwner — Lifecycle ob'ektiga kirishni ta'minlovchi Jetpack interfeysi
  • Activity va AndroidX AppCompactdan Fragmentda sukut bo'yicha amalga oshirilgan
  • LifecycleObserver va DefaultLifecycleObserver orqali hodisalarga obuna bo'lishga imkon beradi
  • Xotira oqib ketishining oldini oladi — kuzatuvchilar yo'q qilishda avtomatik ravishda obunani bekor qiladi
  • ViewModel, LiveData va boshqa Jetpack komponentlarida xavfsiz ishlash uchun ishlatiladi

LifecycleOwner nima?

LifecycleOwner — bu androidx.lifecycle paketidagi interfeys bo'lib, yagona getLifecycle() metodini o'z ichiga oladi, u Lifecycle ob'ektini qaytaradi. Ushbu ob'ekt komponentning joriy holatini (CREATED, STARTED, RESUMED, DESTROYED) kuzatib boradi va o'zgarishida barcha obuna bo'lgan kuzatuvchilarni xabardor qiladi. LifecycleOwner Architecture Components qismidir va lifecycle-runtime kutubxonasiga kiradi.

Interfeysning asosiy vazifasi — hayot siklini kirishni standartlashtirishdir. Jetpack paydo bo'lishidan oldin dasturchilar onStartda qo'lda obuna bo'lish va onStopda obunani bekor qilishdan foydalanardilar, bu kod takrorlanishiga va xatolarga olib keldi. LifecycleOwner bu muammoni barcha Android komponentlari uchun yagona mexanizm taqdim etib hal qiladi. Hayot sikli metodlarini aniq chaqirish o'rniga, dasturchi Lifecycle-ga bir marta obuna bo'ladi va bildirishnomalar avtomatik keladi.

Interfeys Kotlin-da bitta abstrakt metodga ega funktsional interfeys sifatida e'lon qilingan:

kotlin
interface LifecycleOwner {
    val lifecycle: Lifecycle
}

Interfeysning funktsional xususiyati tufayli uni delegat yoki lambda yordamida amalga oshirish oson. Bu, ayniqsa, Custom Views va xostning hayot sikli o'zgarishlariga reaksiya berishi kerak bo'lgan ViewModel sinflarini yaratish uchun qulaydir. getLifecycle() dan olingan Lifecycle ob'ekti obunalarni boshqarish uchun addObserver va removeObserver metodlarini taqdim etadi.

LifecycleOwner qanday ishlaydi

LifecycleOwner ikkita asosiy sinf bilan birgalikda ishlaydi: Lifecycle va LifecycleObserver. Lifecycle komponentning joriy holatini State enum (INITIALIZED, CREATED, STARTED, RESUMED, DESTROYED) shaklida saqlaydi va ular orasidagi o'tishlarni kuzatadi. Holat o'zgarganda, Lifecycle barcha ro'yxatdan o'tgan kuzatuvchilarni xabardor qiladi, tegishli annotatsiya qilingan metodlarni chaqiradi. Ushbu mexanizm "lifecycle-aware" deb ataladi — kod faqat komponent tegishli holatda bo'lganda bajariladi.

Hodisalarni uzatish mexanizmi Observer naqshiga asoslanadi. LifecycleOwner Observable rolini, LifecycleObserver amalga oshirilishi esa Observer rolini o'ynaydi. Activity yoki Fragment o'z holatini o'zgartirganda (onCreate → onStart → onResume → onPause → onStop → onDestroy) AndroidX tizimiga avtomatik qo'shiladigan ichki ReportFragment mexanizmi orqali Lifecycle-ni xabardor qiladi. Dasturchi Lifecycle metodlarini qo'lda chaqirishi shart emas — hamma narsa avtomatik sodir bo'ladi.

Lifecycle holatiHodisaAndroid hayot sikli metodi
INITIALIZEDonCreatedan oldin
CREATEDON_CREATEonCreate
STARTEDON_STARTonStart
RESUMEDON_RESUMEonResume
STARTEDON_PAUSEonPause
CREATEDON_STOPonStop
DESTROYEDON_DESTROYonDestroy

Muhim tafsilot: Lifecycle ON_STOP va ON_DESTROY hodisalari jarayonning favqulodda tugashi holatida ham yetkazilishini kafolatlaydi. Bu LifecycleOwner-ni muhim resurslarni bo'shatish uchun ishonchli vositaga aylantiradi. Oddiy holatni saqlash uchun ViewModel-da SavedStateHandle dan foydalanish tavsiya etiladi, ammo LifecycleOwner asosiy xavfsizlik darajasini ta'minlaydi.

LifecycleObserver va DefaultLifecycleObserver

LifecycleOwner hodisalariga obuna bo'lishning ikki usuli mavjud: klassik annotatsiyali LifecycleObserver va zamonaviy aniq metodli DefaultLifecycleObserver. Ikkinchi yondashuv Google tomonidan 2022 yildan boshlab tavsiya etiladi, chunki u yaxshiroq tip xavfsizligini ta'minlaydi va annotatsiya yondashuvida ishlatilgan refleksiyadan qochadi. DefaultLifecycleObserver Java 8+ yoki Kotlin talab qiladi va yangi loyihalar uchun afzal hisoblanadi.

DefaultLifecycleObserver orqali obuna bo'lish namunasi:

kotlin
class MyObserver : DefaultLifecycleObserver {
    override fun onStart(owner: LifecycleOwner) {
        // GPS kuzatuvini ishga tushirish faqat komponent faol bo'lganda
        startLocationUpdates()
    }

    override fun onStop(owner: LifecycleOwner) {
        // Fon rejimiga o'tishda xavfsiz to'xtatish
        stopLocationUpdates()
    }
}

// Ulanish:
lifecycleOwner.lifecycle.addObserver(MyObserver())

DefaultLifecycleObserver-ning har bir metodi parametr sifatida LifecycleOwner qabul qiladi. Bu kuzatuvchiga bajarilayotgan komponentning kontekstiga alohida uzatmasdan kirish imkonini beradi. Ushbu yondashuv kodni modulli va sinovdan o'tkazish mumkin qiladi — Observer Activity yoki Fragmentning aniq amalga oshirilishiga bog'liq emas, balki LifecycleOwner abstraksiyasi bilan ishlaydi.

LifecycleObserver annotatsiya yondashuvi

@OnLifecycleEvent annotatsiyasi bilan eski usul hali ham eski loyihalarda uchraydi, ammo yangi kod uchun tavsiya etilmaydi. Annotatsiyalarni qayta ishlash uchun zarur bo'lgan refleksiya qo'shimcha yuk hosil qiladi va kompilyatsiya bosqichida aniqlanmaydigan xatolarga olib kelishi mumkin. Google rasmiy ravishda DefaultLifecycleObserver-ga o'tishni tavsiya qiladi.

kotlin
// Eskirgan yondashuv — yangi loyihalar uchun tavsiya etilmaydi
class MyLegacyObserver : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStart() {
        startLocationUpdates()
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStop() {
        stopLocationUpdates()
    }
}

Annotatsiya yondashuvi muhim kamchilikka ega: Observer-ning hayot muddatini nazorat qilmaslik. Agar dasturchi LifecycleOwner yo'q qilinganda Observer-ni obunadan chiqarishni unutib qo'ysa, Observer obyekti axlat yig'uvchi ishga tushguniga qadar xotirada qoladi. DefaultLifecycleObserver bu muammoni hal qiladi — Observer Lifecycle-ga bog'langan va DESTROYED holatiga o'tishda avtomatik ravishda obunadan chiqariladi.

Activity va Fragmentda LifecycleOwner

AppCompat 1.1.0 va AndroidX Fragment 1.2.0 dan boshlab, AppCompatActivity yoki Fragment-dan meros oladigan barcha Activity va Fragment avtomatik ravishda LifecycleOwner hisoblanadi. Bu getLifecycle() metodi ularda sukut bo'yicha mavjudligini anglatadi va hayot sikli hodisalariga obuna qo'shimcha sozlamasiz ishlaydi. Dasturchi Activity yoki Fragmentning istalgan joyidan lifecycle.addObserver() chaqirishi kifoya.

Activity da LifecycleOwner integratsiyasi misolini ko'rib chiqaylik:

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(LocationObserver(this))
    }
}

Ushbu misolda lifecycle — AndroidX Activity tufayli mavjud bo'lgan extension property. LocationObserver Observer-i Activity-ning boshlanishi (ON_START) va to'xtashi (ON_STOP) haqida avtomatik bildirishnomalarni oladi. Ekran aylantirilganda, Observer ON_DESTROY va keyin ON_CREATE haqida xabardor qilinadi, bu qo'shimcha kodlarsiz konfiguratsiya o'zgarishlarini to'g'ri qayta ishlashga imkon beradi.

Fragmentda LifecycleOwner

Fragment interfeys orqali LifecycleOwner-ni amalga oshiradi va uning Lifecycle-i Fragment-ning hayot siklini bog'langan, ota-ona Activity-ga emas. Bu muhim: Fragment-ning Lifecycle-i Fragment tranzaksiyadan o'chirilganda DESTROYED holatiga o'tadi, Activity esa RESUMED holatida qolishi mumkin. Bu farq kuzatuvchiga har bir komponentning hayot siklini alohida obuna qilishga imkon beradi.

kotlin
class MyFragment : Fragment() {
    private val uiStateObserver = UiStateObserver()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        lifecycle.addObserver(uiStateObserver)
    }
}

Fragmentda LifecycleOwner dan foydalanishning muhim afzalligi — Fragment DESTROYED holatiga o'tganda avtomatik obunani bekor qilish. Bu, ayniqsa, Fragmentlar dinamik yaratiladigan va yo'q qilinadigan ViewPager uchun dolzarbdir. Ushbu stsenariyda obunalarni qo'lda boshqarish juda murakkab va xatolarga moyil bo'lar edi.

Maxsus LifecycleOwner yaratish

LifecycleOwner interfeysi hayot sikliga ega bo'lgan har qanday sinfda amalga oshirilishi mumkin. Bu Custom Views, Service va hatto ba'zi arxitektura yechimlarida ViewModel uchun foydalidir. Google Lifecycle holatini boshqaradigan va hodisalarni yaratadigan yordamchi LifecycleRegistry sinfini taqdim etadi. Dasturchi komponent holati o'zgarganda LifecycleRegistry ning tegishli metodlarini qo'lda chaqirishi kerak.

Custom View da LifecycleOwner amalga oshirish namunasi:

kotlin
class MyCustomView(
    context: Context,
    attrs: AttributeSet?
) : FrameLayout(context, attrs), LifecycleOwner {

    private val lifecycleRegistry = LifecycleRegistry(this)

    override val lifecycle: Lifecycle
        get() = lifecycleRegistry

    fun onStart() {
        lifecycleRegistry.setCurrentState(Lifecycle.State.STARTED)
    }

    fun onStop() {
        lifecycleRegistry.setCurrentState(Lifecycle.State.CREATED)
    }
}

Ushbu misolda LifecycleRegistry holat ombori rolini o'ynaydi. onStart/onStop metodlari ota-ona komponent (masalan, Activity) tomonidan Custom View ko'rinadigan yoki yashirin bo'lganda chaqirilishi kerak. LifecycleRegistry holatlar o'rtasidagi o'tish uchun zarur hodisalarni avtomatik hisoblab chiqadi va barcha obuna bo'lgan Observer-larni xabardor qiladi.

Maxsus LifecycleOwner amalga oshirishda qoidaga rioya qilish muhim: LifecycleRegistry holati hayot siklining tegishli metodida, barcha boshqa amallardan so'ng, eng oxirida yangilanishi kerak. Bu Observer-lar komponent yangi holatga to'liq tayyor bo'lganda bildirishnoma olishini kafolatlaydi. LifecycleRegistry.createUnsafe dan muqobil sifatida foydalanish ham mumkin, ammo bu iplar bilan ehtiyotkorlikni talab qiladi.

Jetpack komponentlarida LifecycleOwner

LifecycleOwner bir nechta asosiy Android Jetpack komponentlari uchun poydevordir. LiveData faol holatni aniqlash va komponent yo'q qilinganda avtomatik obunani bekor qilish uchun LifecycleOwner-dan foydalanadi. ViewModel to'g'ridan-to'g'ri LifecycleOwner-ni amalga oshirmaydi, lekin SavedStateHandle orqali Lifecycle olishi mumkin. Navigation Component NavBackStackEntry da obunalarni boshqarish uchun LifecycleOwner-dan foydalanadi. Ushbu bog'liqlikni tushunish ilova arxitekturasini mustahkam poydevor ustida qurishga yordam beradi.

LiveData-ning LifecycleOwner bilan o'zaro ta'siri:

kotlin
class ExampleActivity : AppCompatActivity() {
    private val viewModel: ExampleViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel.userData.observe(this) { data ->
            // this — LifecycleOwner (Activity)
            // Kod faqat Activity RESUMED holatida bo'lganda bajariladi
            updateUI(data)
        }
    }
}

LiveData observe() metodida LifecycleOwner talab qiladi, chunki bu UI yangilanishlari faqat faol holatda sodir bo'lishini kafolatlaydi. Agar Activity fonda bo'lsa, LiveData oxirgi qiymatni saqlaydi, lekin Observer-ni xabardor qilmaydi. RESUMED holatiga qaytganda, Observer tarmoq yoki ma'lumotlar bazasiga qo'shimcha so'rovlarsiz joriy qiymatni oladi.

DataBinding ham observable maydonlarni Activity yoki Fragment-ning hayot siklini bog'lash uchun LifecycleOwner-dan foydalanadi. Bu ViewModel + DataBinding birikmasida xotira oqib ketishining oldini olishga imkon beradi — barcha obunalar LifecycleOwner yo'q qilinganda avtomatik tozalanadi. Ushbu yondashuv kodni deklarativ va xavfsiz qiladi.

Foydalanish bo'yicha tavsiyalar

LifecycleOwner dan to'g'ri foydalanish bir nechta asosiy qoidalarga rioya qilishni talab qiladi. Birinchi va eng muhimi: har doim Observer-ni onCreate/onViewCreated da obuna qiling, kechiktirmang. Bu Observer-ning Lifecycle-ning boshlang'ich holatini (onCreatedan keyin CREATED) olishini va hodisalarni o'tkazib yubormasligini kafolatlaydi. Ikkinchi qoida: barcha yangi loyihalar uchun annotatsiya yondashuvi o'rniga DefaultLifecycleObserver dan foydalaning.

  • LifecycleOwner havolasini statik maydonlarda yoki singletonlarda saqlamang — bu butun Activity ning oqib ketishiga olib keladi
  • Hayot sikli holatini getCurrentState() orqali tekshiring holatga sezgir amallarni bajarishdan oldin
  • Observer-larni lambda ichida yaratmang — har bir rekombinatsiya yangi ob'ekt yaratadi va eski Observer-lar avtomatik obunadan chiqmaydi
  • Korutinlar uchun repeatOnLifecycle dan foydalaning — blok belgilangan holatga kirishda ishga tushadi va undan chiqishda bekor qilinadi
  • Fon ipidan LifecycleRegistry-da setCurrentState chaqirmang — bu hayot siklini yagona ipli kafolatlarini buzadi

Korutinlar va LifecycleOwner bilan ishlashning zamonaviy yondashuvi — repeatOnLifecycle kengaytmasi:

kotlin
lifecycleScope.launch {
    repeatOnLifecycle(Lifecycle.State.STARTED) {
        viewModel.flow.collect { value ->
            updateUI(value)
        }
    }
}

Ushbu naqsh Flow-da collect faqat STARTED yoki RESUMED holatida faol bo'lishini kafolatlaydi. STOPPED holatiga o'tganda kolleksiya avtomatik bekor qilinadi va STARTED holatiga qaytganda qayta ishga tushiriladi. repeatOnLifecycle Fragmentda Flow-dan qo'lda obunani bekor qilishni almashtiradi va UI komponentlarida asinxron ma'lumot oqimlari bilan ishlash uchun Google tomonidan tavsiya etilgan yondashuvdir.

Yana bir muhim tavsiya: LifecycleObserver-dan hayot sikli bilan bog'liq bo'lmagan mantiq uchun suiiste'mol qilmang. Agar komponent ma'lum bir holatda harakatni bajarishi kerak bo'lsa, lekin yo'q qilinganda obunani bekor qilishni talab qilmasa, onStart/onStop da metodlarni aniq chaqirishdan foydalanish yaxshiroqdir. LifecycleObserver uzoq muddatli komponentlar (LocationListener, SensorManager) uchun asoslidir, bu erda obunalarni qo'lda boshqarish murakkab va xatolarga moyildir.

Ko'p beriladigan savollar

LifecycleOwner Lifecycle-dan nimasi bilan farq qiladi?

LifecycleOwner — ob'ekt hayot sikliga ega ekanligini e'lon qiluvchi interfeys. Lifecycle — joriy holatni saqlaydigan va Observer-ni boshqaradigan sinf. LifecycleOwner getLifecycle() orqali Lifecycle ni taqdim etadi.

LifecycleObserver-ni qo'lda obunadan chiqarish kerakmi?

Yo'q, Lifecycle DESTROYED holatiga o'tganda barcha Observer-larni avtomatik obunadan chiqaradi. Bu LifecycleOwner-ning asosiy afzalliklaridan biri — dasturchi onDestroy da qo'lda removeObserver chaqirishi shart emas.

Fragmentda LifecycleOwner qanday ishlaydi?

Fragment AndroidX fragment interfeysi orqali LifecycleOwner-ni amalga oshiradi. Uning Lifecycle-i Activity-dan alohida Fragment-ning hayot siklini bog'langan. Bu kuzatuvchiga ota-ona Activity emas, aynan Fragment hodisalariga reaksiya berish imkonini beradi.

Custom View da LifecycleOwner amalga oshirish mumkinmi?

Ha, buning uchun LifecycleRegistry ishlatiladi. Custom View LifecycleOwner interfeysini amalga oshirishi va ko'rinish yoki oynaga ulanish o'zgarganda LifecycleRegistry holatini qo'lda yangilashi kerak.

CoroutineScope mavjud bo'lsa, LifecycleOwner nima uchun kerak?

LifecycleOwner boshqa vazifani hal qiladi: hayot sikli hodisalariga obunalarni boshqarish, korutinlarni bekor qilishni emas. Korutinlar uchun lifecycleScope ishlatiladi, u LifecycleOwner yo'q qilinganda ishga tushirilgan korutinlarni avtomatik bekor qiladi.

Xulosa

  • LifecycleOwner — getLifecycle() orqali hayot sikliga kirish uchun Android Jetpack interfeysi
  • AppCompatActivity va AndroidX Fragmentida sukut bo'yicha amalga oshirilgan
  • DefaultLifecycleObserver — zamonaviy, tip xavfsiz obuna usulini qo'llab-quvvatlaydi
  • DESTROYED holatiga o'tganda Observer-ni avtomatik obunadan chiqaradi, xotira oqib ketishining oldini oladi
  • LiveData, DataBinding va Navigation Componentda lifecycle-aware asosi sifatida ishlatiladi
  • Custom Views va Services uchun LifecycleRegistry orqali maxsus LifecycleOwner yaratishga imkon beradi
  • Zamonaviy muqobil — korutinlar va Flow uchun repeatOnLifecycle, qo'lda obunani almashtiradi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing