Parça yaşam döngüsü

Her Fragment örneğinin kendi yaşam döngüsü vardır. Bir kullanıcı uygulamanızda gezinirken ve uygulamanızla etkileşimde bulunduğunda, parçalarınız ekleme, kaldırma ve ekrana girme ya da ekrandan çıkma gibi yaşam döngüleri içinde çeşitli durumlardan geçer.

Fragment, yaşam döngüsünü yönetmek için LifecycleOwner aracını uygulayarak getLifecycle() yöntemiyle erişebileceğiniz bir Lifecycle nesnesini kullanıma sunar.

Olası her Lifecycle durumu Lifecycle.State sıralamasında temsil edilir.

Lifecycle üzerine Fragment derleyerek Yaşam Döngüsünü Yaşam Döngüsüne Duyarlı Bileşenlerle İşleme için sunulan teknikleri ve sınıfları kullanabilirsiniz. Örneğin, yaşam döngüsüne duyarlı bir bileşen kullanarak cihazın konumunu ekranda görüntüleyebilirsiniz. Bu bileşen, parça etkinleştiğinde dinlemeyi otomatik olarak başlatabilir ve etkin olmayan bir duruma geçtiğinde durabilir.

Fragment sınıfı, LifecycleObserver kullanmaya alternatif olarak, bir parçanın yaşam döngüsündeki her bir değişikliğe karşılık gelen geri çağırma yöntemleri içerir. Bunlar arasında onCreate(), onStart(), onResume(), onPause(), onStop() ve onDestroy() yer alır.

Bir parçanın görünümünde, parçanın Lifecycle öğesinden bağımsız olarak yönetilen ayrı bir Lifecycle bulunur. Parçalarda kendi görünümleri için getViewLifecycleOwner() veya getViewLifecycleOwnerLiveData() kullanılarak erişilebilen bir LifecycleOwner bulunur. Görünümün Lifecycle öğesine erişebilmek, Yaşam döngüsüne duyarlı bir bileşenin yalnızca ekranda görüntülenmesi amaçlanan LiveData gözlemleme gibi bir parçanın görünümü varken işlem yapması gereken durumlarda yararlıdır.

Bu konu, Fragment yaşam döngüsünü ayrıntılı olarak tartışarak bir parçanın yaşam döngüsü durumunu belirleyen kuralların bazılarını açıklar ve Lifecycle durumları ile parça yaşam döngüsü geri çağırmaları arasındaki ilişkiyi gösterir.

Parçalar ve parça yöneticisi

Bir parça örneklendiğinde INITIALIZED durumunda başlar. Bir parçanın yaşam döngüsünün geri kalanında geçişi için FragmentManager'e eklenmesi gerekir. FragmentManager, parçasının hangi durumda olması gerektiğini belirlemekten ve bu parçayı bu duruma taşımaktan sorumludur.

FragmentManager, parça yaşam döngüsünün yanı sıra parçaları ana makine etkinliğine eklemekten ve parça artık kullanılmadığında bunları çıkarmaktan da sorumludur. Fragment sınıfında, onAttach() ve onDetach() olmak üzere iki geri çağırma yöntemi bulunur. Bu yöntemlerden biri gerçekleştiğinde çalışma yapmak için bu yöntemleri geçersiz kılabilirsiniz.

onAttach(), parça bir FragmentManager öğesine eklendiğinde ve ana makine etkinliğine eklendiğinde çağrılır. Bu noktada parça aktiftir ve FragmentManager, yaşam döngüsü durumunu yönetir. Bu noktada, findFragmentById() gibi FragmentManager yöntemleri bu parçayı döndürür.

onAttach() her zaman Yaşam döngüsü durumu değişikliklerinden önce çağrılır.

Parça, bir FragmentManager öğesinden kaldırıldığında ve ana makine etkinliğinden ayrıldığında onDetach() geri çağırması çağrılır. Parça artık etkin değil ve artık findFragmentById() kullanılarak alınamaz.

onDetach(), her zaman Yaşam döngüsü durum değişikliklerinden sonra çağrılır.

Bu geri çağırmaların FragmentTransaction attach() ve detach() yöntemleriyle ilgili olmadığını unutmayın. Bu yöntemler hakkında daha fazla bilgi için Parça işlemleri bölümüne bakın.

Parça yaşam döngüsü durumları ve geri çağırmalar

FragmentManager, bir parçanın yaşam döngüsü durumunu belirlerken aşağıdakileri dikkate alır:

  • Bir parçanın maksimum durumu, FragmentManager tarafından belirlenir. Bir parça, FragmentManager durumunun ötesine geçemez.
  • FragmentTransaction kapsamında, setMaxLifecycle() kullanarak parça üzerinde maksimum yaşam döngüsü durumunu ayarlayabilirsiniz .
  • Bir parçanın yaşam döngüsü durumu hiçbir zaman üst öğesinden büyük olamaz. Örneğin, bir üst parça veya etkinlik, alt parçalarından önce başlatılmalıdır. Benzer şekilde, alt parçalar da üst parçalarından veya etkinliğinden önce durdurulmalıdır.
parça yaşam döngüsü durumlarını ve bunların hem parçanın yaşam döngüsü geri çağırmaları hem de parçanın görüntüleme yaşam döngüsüyle olan ilişkileri
Şekil 1. Lifecycle parçasında durum ve bunların hem parçanın yaşam döngüsü geri çağırmalarıyla hem de parçanın görünümüyle (Lifecycle) ilişkisi.

Şekil 1'de, parçanın her bir Lifecycle durumu ve bu durumların hem parçanın yaşam döngüsü geri çağırmalarıyla hem de parçanın görünümü Lifecycle ile nasıl ilişkili olduğu gösterilmiştir.

Bir parça, yaşam döngüsü boyunca ilerledikçe durumlarında yukarı ve aşağı hareket eder. Örneğin, arka yığının üst kısmına eklenen bir parça CREATED konumundan STARTED konumuna RESUMED konumuna doğru yukarı doğru hareket eder. Buna karşılık, bir parça arka yığından çıkarıldığında bu durumlarda aşağı doğru ilerler ve RESUMED konumundan STARTED konumuna CREATED ve son olarak da DESTROYED konumuna gelir.

Yukarı durum geçişleri

Yaşam döngüsü durumlarında yukarı doğru ilerlerken bir parça, önce yeni durumu için ilişkili yaşam döngüsü geri çağırmasını çağırır. Bu geri çağırma sona erdiğinde, ilgili Lifecycle.Event gözlemcilere parçanın Lifecycle ile yayınlanır, ardından parça örneklenmişse parçanın görünümü Lifecycle ile gösterilir.

Parça OLUŞTURULDU

Parçanız CREATED durumuna ulaştığında FragmentManager'a eklenir ve onAttach() yöntemi zaten çağrılmıştır.

Burası, parçanın SavedStateRegistry etiketi aracılığıyla parçanın kendisiyle ilişkili kayıtlı durumları geri yüklemek için uygun yerdir. Parçanın görünümünün şu anda oluşturulmadığını ve parçanın görünümüyle ilişkilendirilmiş herhangi bir durumun yalnızca görünüm oluşturulduktan sonra geri yükleneceğini unutmayın.

Bu geçiş, onCreate() geri çağırmasını çağırır. Geri çağırma, daha önce onSaveInstanceState() tarafından kaydedilen durumları içeren bir savedInstanceState Bundle bağımsız değişkeni de alır. savedInstanceState öğesinin, parça ilk oluşturulduğunda null değerine sahip olduğunu ancak onSaveInstanceState() değerini geçersiz kılmasanız bile sonraki düzenlemeler için her zaman boş olmadığını unutmayın. Daha fazla ayrıntı için Parçalarla durum kaydetme bölümüne bakın.

Parça OLUŞTURULDU ve Görünüm BAŞLATILDI

Parçanın Lifecycle görünümü yalnızca Fragment öğeniz geçerli bir View örneği sağladığında oluşturulur. Çoğu durumda, görünümü uygun zamanda otomatik olarak artıran bir @LayoutId alan parça oluşturucuları kullanabilirsiniz. Ayrıca, parçanızın görünümünü programatik olarak genişletmek veya oluşturmak için onCreateView() öğesini geçersiz kılabilirsiniz.

Parçanızın görünümü boş olmayan bir View ile örneklenirse bu View parçada ayarlanır ve getView() kullanılarak alınabilir. Daha sonra getViewLifecycleOwnerLiveData(), parçanın görünümüne karşılık gelen yeni INITIALIZED LifecycleOwner ile güncellenir. Yaşam döngüsü geri çağırması da bu aşamada onViewCreated() olarak adlandırılmaktadır.

Bu, görünümünüzün ilk durumunu ayarlamak, geri çağırmaları parçanın görünümünü güncelleyen LiveData örneklerini gözlemlemek ve parçanızın görünümündeki herhangi bir RecyclerView veya ViewPager2 örneğinde bağdaştırıcı ayarlamak için uygun yerdir.

Parça ve Görünüm OLUŞTURULDU

Parçanın görünümü oluşturulduktan sonra, varsa önceki görünüm durumu geri yüklenir ve görünümün Lifecycle öğesi daha sonra CREATED durumuna taşınır. Görünüm yaşam döngüsü sahibi, ON_CREATE etkinliğini gözlemcilerine de yayınlar. Burada, parçanın görünümüyle ilişkilendirilmiş tüm ek durumları geri yüklemeniz gerekir.

Bu geçiş, onViewStateRestored() geri çağırmasını da çağırır.

Parça ve Görünüm BAŞLANGIÇ

Yaşam döngüsüne duyarlı bileşenleri bir parçanın STARTED durumuna bağlamanız şiddetle önerilir. Bu durum, bir parça oluşturulmuşsa parçanın görünümünün kullanılabilir olmasını ve parçanın alt FragmentManager öğesinde bir FragmentTransaction işleminin güvenli olmasını garanti eder. Parçanın görünümü null değilse parçanın Lifecycle görünümü STARTED konumuna taşındıktan hemen sonra parçanın Lifecycle görünümü STARTED görünümüne taşınır.

Parça STARTED haline geldiğinde onStart() geri çağırması çağrılır.

Parça ve Görünüm DEVAM ETTİ

Parça görünür olduğunda tüm Animator ve Transition efektleri tamamlanmış ve parça kullanıcı etkileşimi için hazır hale gelir. Parçanın Lifecycle özelliği RESUMED durumuna taşınır ve onResume() geri çağırma çağrılır.

RESUMED öğesine geçiş, kullanıcının artık parçanızla etkileşimde bulunabileceğini belirtmek için uygun sinyaldir. RESUMED olmayan parçalar görünümlerine manuel olarak odaklanmamalı veya giriş yöntemi görünürlüğünü işlemeye çalışmamalıdır.

Aşağı durum geçişleri

Bir parça daha düşük bir yaşam döngüsü durumuna doğru hareket ettiğinde ilgili Lifecycle.Event, gözlemcilere parçanın örneklendirmesiyse Lifecycle görünümü tarafından yayınlanır ve ardından parçanın Lifecycle simgesi yayınlanır. Bir parçanın yaşam döngüsü etkinliği yayınlandıktan sonra, parça ilişkili yaşam döngüsü geri çağırma işlevini çağırır.

Parça ve Görünüm BAŞLANGIÇ

Kullanıcı, parçadan ayrılmaya başlayıp parça hâlâ görünürken parçanın ve görünümüne ait Lifecycle öğeleri STARTED durumuna geri taşınır ve ON_PAUSE etkinliğini gözlemcilerine yayınlar. Parça daha sonra onPause() geri çağırmasını çağırır.

Parça ve Görünüm OLUŞTURULDU

Parça artık görünür olmadığında, parça ve görünümü için Lifecycle öğeleri CREATED durumuna taşınır ve ON_STOP etkinliğini gözlemcilerine yayınlar. Bu durum geçişi, durdurulan üst etkinlik veya parçanın yanı sıra üst etkinlik veya parça tarafından durumun kaydedilmesiyle de tetiklenir. Bu davranış, ON_STOP etkinliğinin, parçanın durumu kaydedilmeden önce çağrılmasını garanti eder. Bu, ON_STOP etkinliğini, alt FragmentManager üzerinde FragmentTransaction gerçekleştirmenin güvenli olduğu son nokta yapar.

Şekil 2'de gösterildiği gibi onStop() geri çağırma işleminin sırası ve onSaveInstanceState() ile durumun kaydedilmesi API düzeyine göre değişir. API 28'den önceki tüm API düzeyleri için onSaveInstanceState(), onStop() tarihinden önce çağrılır. API düzeyleri 28 ve sonraki sürümler için çağrı sırası tersine çevrilir.

onStop() ve onSaveInstanceState() için sipariş farklılıkları çağırma
Şekil 2. onStop() ve onSaveInstanceState() için çağrı siparişi farklılıkları.

Parça OLUŞTURULDU ve Görünüm KALDIRILDI

Tüm çıkış animasyonları ve geçişleri tamamlandıktan ve parçanın görünümü pencereden ayrıldıktan sonra, parçanın görünümü Lifecycle DESTROYED durumuna taşınır ve ON_DESTROY etkinliğini gözlemcilerine yayınlar. Daha sonra parça, onDestroyView() geri çağırmasını çağırır. Bu noktada, parçanın görünümü kullanım ömrünün sonuna gelmiştir ve getViewLifecycleOwnerLiveData() bir null değeri döndürür.

Bu noktada, parçanın görünümüne yapılan tüm referanslar kaldırılarak, parçanın atık olarak toplanmasını sağlar.

Parça KALDIRILDI

Parça kaldırılırsa veya FragmentManager kaldırılırsa parçanın Lifecycle öğesi DESTROYED durumuna taşınır ve ON_DESTROY etkinliğini gözlemcilerine gönderir. Daha sonra parça, onDestroy() geri çağırmasını çağırır. Bu noktada, parça yaşam döngüsünün sonuna ulaşmıştır.

Ek kaynaklar

Parça yaşam döngüsüyle ilgili daha fazla bilgi için aşağıdaki ek kaynakları inceleyin.

Kılavuzlar

Bloglar