Kullanıcı uygulamanızda gezinirken, uygulamanızdan çıkarken ve uygulamanıza geri dönerken uygulamanızdaki Activity örnekleri, yaşam döngülerindeki farklı durumlara geçer.
Activity sınıfı, bir durum değiştiğinde veya sistem bir etkinliği oluşturduğunda, durdurduğunda, devam ettirdiğinde ya da etkinliğin bulunduğu işlemi sonlandırdığında etkinliğin bunu bilmesini sağlayan bir dizi geri çağırma sağlar.
Yaşam döngüsü geri çağırma yöntemlerinde, kullanıcı etkinlikten ayrılıp etkinliğe yeniden girdiğinde etkinliğinizin nasıl davranacağını belirtebilirsiniz. Örneğin, video oynatıcı uygulaması geliştiriyorsanız kullanıcı başka bir uygulamaya geçtiğinde videoyu duraklatıp ağ bağlantısını sonlandırabilirsiniz. Kullanıcı geri döndüğünde ağa yeniden bağlanıp videoyu kaldığı yerden devam ettirebilirsiniz.
Her geri çağırma, belirli bir durum değişikliğine uygun belirli bir işi gerçekleştirmenize olanak tanır. Doğru işi doğru zamanda yapmak ve geçişleri düzgün bir şekilde yönetmek, uygulamanızı daha sağlam ve performanslı hale getirir. Örneğin, yaşam döngüsü geri çağırma yöntemlerinin iyi bir şekilde uygulanması, uygulamanızın aşağıdakilerden kaçınmasına yardımcı olabilir:
- Kullanıcı uygulamanızı kullanırken telefon araması aldığında veya başka bir uygulamaya geçtiğinde kilitlenme.
- Kullanıcı aktif olarak kullanmadığı halde değerli sistem kaynaklarını tüketme
- Kullanıcı uygulamanızdan ayrılıp daha sonra geri döndüğünde ilerleme durumunun kaybolması.
- Ekran yatay ve dikey yön arasında döndürüldüğünde kilitlenme veya kullanıcının ilerleme durumunun kaybolması.
Bu belgede, etkinlik yaşam döngüsü ayrıntılı olarak açıklanmaktadır. Belge, yaşam döngüsü paradigmasını açıklayarak başlar. Ardından, her bir geri çağırma işlevini açıklar: Bunlar yürütülürken dahili olarak neler olur ve bunlar sırasında neleri uygulamanız gerekir?
Ardından, etkinlik durumu ile bir işlemin sistem tarafından sonlandırılmaya karşı savunmasızlığı arasındaki ilişkiyi kısaca açıklar. Son olarak, etkinlik durumları arasındaki geçişlerle ilgili çeşitli konular ele alınmaktadır.
En iyi uygulamalarla ilgili rehberlik de dahil olmak üzere yaşam döngülerini yönetme hakkında bilgi için Jetpack Compose'da yaşam döngüsü ve Kullanıcı arayüzü durumlarını kaydetme başlıklı makaleleri inceleyin. Etkinlikleri mimari bileşenlerle birlikte kullanarak sağlam ve üretim kalitesinde bir uygulama tasarlamayı öğrenmek için Uygulama mimarisi kılavuzu'na bakın.
Etkinlik yaşam döngüsü kavramları
Activity sınıfı, etkinlik yaşam döngüsünün aşamaları arasındaki geçişleri yönetmek için altı geri çağırmadan oluşan temel bir grup sağlar: onCreate, onStart, onResume, onPause, onStop ve onDestroy. Sistem, etkinlik yeni bir duruma girdiğinde bu geri çağırmaların her birini çağırır.
Şekil 1'de bu paradigmanın görsel bir temsili gösterilmektedir.
Kullanıcı etkinlikten ayrılmaya başladığında sistem, etkinliği sonlandırmak için yöntemleri çağırır. Bazı durumlarda etkinlik yalnızca kısmen kaldırılır ve hâlâ bellekte bulunur (ör. kullanıcı başka bir uygulamaya geçtiğinde). Bu durumlarda etkinlik tekrar ön plana gelebilir.
Kullanıcı etkinliğe geri dönerse etkinlik, kullanıcının kaldığı yerden devam eder. Birkaç istisna dışında, uygulamaların arka planda çalışırken etkinlik başlatması kısıtlanır.
Sistemin belirli bir işlemi ve bu işlemdeki etkinlikleri sonlandırma olasılığı, etkinliğin o andaki durumuna bağlıdır. Durum ile çıkarılmaya karşı savunmasızlık arasındaki ilişki hakkında daha fazla bilgi için etkinlik durumu ve bellekten çıkarılma ile ilgili bölüme bakın.
Etkinliğinizin karmaşıklığına bağlı olarak, tüm yaşam döngüsü yöntemlerini uygulamanız gerekmeyebilir. Ancak her birini anlamanız ve uygulamanızın kullanıcıların beklediği şekilde davranmasını sağlayanları uygulamanız önemlidir.
Compose ve yaşam döngüsü
Compose'da, iş mantığını veya manuel gözlemci kurulumunu doğrudan onStart ya da onResume gibi etkinlik geri çağırmalarına yerleştirmekten kaçının. Bunun yerine, yaşam döngüsüne duyarlı efektler ve kullanıcı arayüzünün ekrandaki varlığıyla otomatik olarak uyum sağlayan duruma duyarlı gözlemciler kullanın.
- Yaşam döngüsüne duyarlı koleksiyon:
ViewModeluygulamanızdaki akışları kullanmak içincollectAsStateWithLifecyclekullanın. Bu API, kullanıcı arayüzü Başlatıldı durumuna girdiğinde otomatik olarak toplamaya başlar ve arka plana geçtiğinde durur. Böylece gereksiz kaynak tüketimi önlenir. Akışı durum olarak topladıktan sonra, bir yaşam döngüsü olayı gerçekleştiğinde kod çalıştırmak içinLifecycleEffectskullanabilirsiniz. - Mantık akışı: Bu API'leri kullanan kullanıcı arayüzü, oluşturma ağacı aracılığıyla yaşam döngüsü durumuna doğal bir şekilde tepki verir. Böylece iş mantığı yalnızca kullanıcı bileşenle aktif olarak etkileşimde bulunduğunda yürütülür.
Compose ve yaşam döngüsü hakkında daha fazla bilgi için Jetpack Compose'da yaşam döngüsü başlıklı makaleyi inceleyin.
Yaşam döngüsü geri çağırma yöntemleri
Bu bölümde, etkinlik yaşam döngüsü sırasında kullanılan geri çağırma yöntemleri hakkında kavramsal ve uygulama bilgileri verilmektedir.
Bazı işlemler, etkinlik yaşam döngüsü yöntemlerine aittir. Ancak bağımlı bir bileşenin işlemlerini uygulayan kodu, etkinlik yaşam döngüsü yöntemi yerine bileşene yerleştirin. Bunu yapmak için bağımlı bileşeni yaşam döngüsüne duyarlı hale getirmeniz gerekir. Bağımlı bileşenlerinizi yaşam döngüsüne duyarlı hale getirmeyi öğrenmek için Jetpack Compose'da yaşam döngüsü başlıklı makaleyi inceleyin.
onCreate
Sistem etkinliği ilk oluşturduğunda tetiklenen bu geri çağırmayı uygulamanız gerekir. Etkinlik oluşturulduğunda Oluşturuldu durumuna geçer. onCreate yönteminde, etkinliğin tüm yaşam döngüsü boyunca yalnızca bir kez gerçekleşen temel uygulama başlatma mantığını uygulayın.
Örneğin, onCreate uygulamanız verileri listelere bağlayabilir, etkinliği bir ViewModel ile ilişkilendirebilir ve bazı sınıf kapsamı değişkenlerini örneklendirebilir. Bu yöntem, etkinliğin daha önce kaydedilmiş durumunu içeren bir Bundle nesnesi olan savedInstanceState parametresini alır. Etkinlik daha önce hiç mevcut olmadıysa Bundle nesnesinin değeri boştur.
Etkinliğinizin yaşam döngüsüne bağlı, yaşam döngüsüne duyarlı bir bileşeniniz varsa ON_CREATE etkinliğini alır. @OnLifecycleEvent ile ek açıklama eklenen yöntem çağrılır. Böylece yaşam döngüsüne duyarlı bileşeniniz, oluşturulan durum için gereken tüm kurulum kodlarını çalıştırabilir.
Aşağıdaki örnekte, Text composable'ın en temel etkinliğe nasıl entegre edileceği gösterilmektedir:
class ExampleActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // In here, we can call composables! MaterialTheme { Greeting(name = "compose") } } } } @Composable fun Greeting(name: String) { Text(text = "Hello $name!") }
Etkinliğiniz "Oluşturuldu" durumunda kalmaz. onCreate yönteminin yürütülmesi tamamlandıktan sonra etkinlik Başlatıldı durumuna girer ve sistem, onStart ve onResume yöntemlerini hızlı bir şekilde art arda çağırır.
onStart
Etkinlik, Başlatıldı durumuna girdiğinde sistem onStart yöntemini çağırır.
Bu çağrı, uygulama etkinliğin ön plana çıkması ve etkileşimli hale gelmesi için hazırlanırken etkinliği kullanıcıya görünür hale getirir. Örneğin, kullanıcı arayüzünü yöneten kod bu yöntemle başlatılır.
Etkinlik, Başlatıldı durumuna geçtiğinde etkinliğin yaşam döngüsüne bağlı olan yaşam döngüsüne duyarlı tüm bileşenler ON_START etkinliğini alır.
onStart yöntemi hızlı bir şekilde tamamlanır ve Oluşturuldu durumunda olduğu gibi etkinlik, Başlatıldı durumunda kalmaz. Bu geri çağırma tamamlandığında etkinlik Devam Ettirildi durumuna girer ve sistem onResume yöntemini çağırır.
onResume
Etkinlik, Devam Ettirildi durumuna girdiğinde ön plana gelir ve sistem onResume geri çağırma işlevini çağırır. Bu, uygulamanın kullanıcıyla
etkileşime girdiği durumdur. Uygulama, odağı uygulamadan uzaklaştıracak bir şey olana kadar (ör. cihazın telefon araması alması, kullanıcının başka bir etkinliğe gitmesi veya cihaz ekranının kapanması) bu durumda kalır.
Etkinlik, Devam Ettirildi durumuna geçtiğinde etkinliğin yaşam döngüsüne bağlı olan yaşam döngüsüne duyarlı tüm bileşenler ON_RESUME etkinliğini alır. Yaşam döngüsü bileşenleri, bileşen görünür ve ön plandayken çalışması gereken tüm işlevleri (ör. kamera önizlemesini başlatma) burada etkinleştirebilir.
Kesintiye neden olan bir etkinlik gerçekleştiğinde etkinlik Duraklatıldı durumuna girer ve sistem onPause geri çağırma işlevini çağırır.
Etkinlik, Duraklatıldı durumundan Devam Ettirildi durumuna dönerse sistem onResume yöntemini bir kez daha çağırır. Bu nedenle, onPause sırasında yayınladığınız bileşenleri ilk kullanıma hazırlamak ve etkinliğin her Devam Ediyor durumuna girişinde gerçekleşmesi gereken diğer ilk kullanıma hazırlama işlemlerini gerçekleştirmek için onResume yöntemini uygulayın.
Aşağıda, bileşen ON_RESUME etkinliğini aldığında kameraya erişen, yaşam döngüsüne duyarlı bir bileşen örneği verilmiştir:
class CameraComponent : LifecycleObserver {
...
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun initializeCamera() {
if (camera == null) {
getCamera()
}
}
...
}
Yukarıdaki kod, LifecycleObserver ON_RESUME etkinliğini aldığında kamerayı başlatır. Ancak çoklu pencere modunda, etkinliğiniz duraklatılmış durumda olsa bile tamamen görünür olabilir. Örneğin, uygulama çoklu pencere modundayken kullanıcı etkinliğinizi içermeyen pencereye dokunduğunda etkinliğiniz Duraklatıldı durumuna geçer.
Kameranın yalnızca uygulama devam ettirildiğinde (görünür ve ön planda etkin) etkin olmasını istiyorsanız kamerayı daha önce gösterilen ON_RESUME etkinliğinden sonra başlatın. Etkinlik duraklatılmış ancak görünür durumdayken (ör. çoklu pencere modunda) kameranın etkin kalmasını istiyorsanız kamerayı ON_START etkinliğinden sonra başlatın.
Ancak etkinliğiniz duraklatılmışken kameranın etkin olması, çoklu pencere modunda devam ettirilen başka bir uygulamanın kameraya erişimini engelleyebilir. Bazen etkinliğiniz duraklatılmışken kamerayı etkin tutmanız gerekebilir ancak bunu yaparsanız genel kullanıcı deneyimi olumsuz etkilenebilir.
Bu nedenle, çoklu pencere modu bağlamında paylaşılan sistem kaynaklarının kontrolünü ele almak için yaşam döngüsünün hangi noktasının en uygun olduğunu dikkatlice düşünün. Çoklu pencere modunu destekleme hakkında daha fazla bilgi edinmek için Çoklu pencere modunu destekleme başlıklı makaleyi inceleyin.
Başlatma işlemi gerçekleştirmek için hangi oluşturma etkinliğini seçerseniz seçin, kaynağı serbest bırakmak için ilgili yaşam döngüsü etkinliğini kullandığınızdan emin olun. ON_START etkinliğinden sonra bir şeyi başlatırsanız ON_STOP etkinliğinden sonra serbest bırakın veya sonlandırın. ON_RESUME etkinliğinden sonra başlatırsanız ON_PAUSE etkinliğinden sonra serbest bırakın.
Yukarıdaki kod snippet'i, kamerayı başlatma kodunu yaşam döngüsüne duyarlı bir bileşene yerleştirir. Bunun yerine, bu kodu doğrudan onStart ve onStop gibi etkinlik yaşam döngüsü geri çağırma yöntemlerine yerleştirebilirsiniz ancak bunu önermiyoruz. Bu mantığı bağımsız, yaşam döngüsüne duyarlı bir bileşene eklemek, kodu kopyalamak zorunda kalmadan bileşeni birden fazla etkinlikte yeniden kullanmanıza olanak tanır. Yaşam döngüsüne duyarlı bileşen oluşturmayı öğrenmek için Jetpack Compose'da yaşam döngüsü başlıklı makaleyi inceleyin.
onPause
Sistem, kullanıcının etkinliğinizden ayrıldığının ilk göstergesi olarak bu yöntemi çağırır ancak bu her zaman etkinliğin yok edildiği anlamına gelmez. Etkinliğin artık ön planda olmadığını ancak kullanıcı çoklu pencere modundaysa görünür durumda olduğunu gösterir. Bir etkinliğin bu duruma girmesinin birkaç nedeni vardır:
onResumegeri çağırma işleviyle ilgili bölümde açıklandığı gibi, uygulama yürütme işlemini kesintiye uğratan bir etkinlik, mevcut etkinliği duraklatır. En yaygın durum budur.- Çoklu pencere modunda, herhangi bir zamanda yalnızca bir uygulama odaklanır ve sistem diğer tüm uygulamaları duraklatır.
- İletişim kutusu gibi yeni ve yarı şeffaf bir etkinliğin açılması, kapsadığı etkinliği duraklatır. Etkinlik kısmen görünür olduğu ancak odakta olmadığı sürece duraklatılmış olarak kalır.
Bir etkinlik Duraklatıldı durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı olan yaşam döngüsüne duyarlı tüm bileşenler ON_PAUSE etkinliğini alır. Yaşam döngüsü bileşenleri, bileşen ön planda değilken çalışması gerekmeyen tüm işlevleri (ör. kamera önizlemesini durdurma) burada durdurabilir.
Activity, Duraklatıldı durumundayken devam edemeyen veya ölçülü bir şekilde devam edebilecek ve kısa süre içinde devam ettirmeyi beklediğiniz işlemleri duraklatmak ya da ayarlamak için onPause yöntemini kullanın.
Ayrıca, etkinliğiniz duraklatıldığında ve kullanıcı ihtiyaç duymadığında sistem kaynaklarını, sensörlerin (GPS gibi) tutamaçlarını veya pil ömrünü etkileyen kaynakları serbest bırakmak için onPause yöntemini kullanabilirsiniz.
Ancak onResume ile ilgili bölümde belirtildiği gibi, uygulama çoklu pencere modundaysa duraklatılmış bir etkinlik tamamen görünür olabilir. Çoklu pencere modunu daha iyi desteklemek için kullanıcı arayüzüyle ilgili kaynakları ve işlemleri tamamen serbest bırakmak veya ayarlamak üzere onPause yerine onStop kullanabilirsiniz.
ON_PAUSE etkinliğine tepki veren bir LifecycleObserver örneği, önceki ON_RESUME etkinlik örneğinin karşılığıdır ve ON_RESUME etkinliği alındıktan sonra başlatılan kamerayı serbest bırakır:
class CameraComponent : LifecycleObserver {
...
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun releaseCamera() {
camera?.release()
camera = null
}
...
}
Bu örnekte, kamera serbest bırakma kodu ON_PAUSE etkinliği LifecycleObserver tarafından alındıktan sonra yerleştirilir.
onPause yürütme işlemi çok kısadır ve kaydetme işlemlerini gerçekleştirmek için yeterli zaman sunmayabilir. Bu nedenle, uygulama veya kullanıcı verilerini kaydetmek, ağ çağrıları yapmak ya da veritabanı işlemleri yürütmek için onPause kullanmayın.
Bu tür çalışmalar, yöntem tamamlanmadan önce tamamlanmayabilir.
Bunun yerine, ağır yük kapatma işlemlerini onStop sırasında gerçekleştirin. onStop sırasında gerçekleştirilecek uygun işlemler hakkında daha fazla bilgi için sonraki bölüme bakın. Veri kaydetme hakkında daha fazla bilgi için durumu kaydetme ve geri yükleme ile ilgili bölüme bakın.
onPause yönteminin tamamlanması, etkinliğin duraklatıldı durumundan çıktığı anlamına gelmez. Bunun yerine, etkinlik devam edene veya kullanıcı tarafından tamamen görünmez hale gelene kadar bu durumda kalır. Etkinlik devam ederse sistem, onResume geri çağırma işlevini bir kez daha çağırır.
Etkinlik, Duraklatıldı durumundan Devam Ettirildi durumuna dönerse sistem, Activity örneğini bellekte tutar ve sistem onResume yöntemini çağırdığında bu örneği geri çağırır. Bu senaryoda, Devam Ettirildi durumuna kadar olan geri çağırma yöntemlerinden herhangi biri sırasında oluşturulan bileşenleri yeniden başlatmanız gerekmez. Etkinlik tamamen görünmez hale gelirse sistem onStop yöntemini çağırır.
onStop
Etkinliğiniz artık kullanıcı tarafından görülemediğinde Durduruldu durumuna geçer ve sistem onStop geri çağırma işlevini çağırır. Bu durum, yeni başlatılan bir etkinlik tüm ekranı kapladığında ortaya çıkabilir. Sistem, etkinlik çalışmayı tamamlayıp sonlandırılmak üzereyken de onStop yöntemini çağırır.
Etkinlik, Durduruldu durumuna geçtiğinde etkinliğin yaşam döngüsüne bağlı olan yaşam döngüsüne duyarlı tüm bileşenler ON_STOP etkinliğini alır. Yaşam döngüsü bileşenleri, bileşen ekranda görünür değilken çalışması gerekmeyen tüm işlevleri burada durdurabilir.
onStop yönteminde, uygulama kullanıcı tarafından görülmediğinde ihtiyaç duyulmayan kaynakları serbest bırakın veya ayarlayın. Örneğin, uygulamanız animasyonları duraklatabilir veya ayrıntılı konum güncellemelerinden yaklaşık konum güncellemelerine geçebilir. onPause yerine onStop kullanmak, kullanıcı etkinliğinizi çoklu pencere modunda görüntülerken bile kullanıcı arayüzüyle ilgili çalışmaların devam ettiği anlamına gelir.
Ayrıca, CPU'yu nispeten yoğun kullanan kapatma işlemlerini gerçekleştirmek için onStop kullanın. Örneğin, bilgileri veritabanına kaydetmek için daha iyi bir zaman bulamazsanız bunu onStop sırasında yapabilirsiniz. Aşağıdaki örnekte, taslak notun içeriğini kalıcı depolama alanına kaydeden bir onStop uygulaması gösterilmektedir:
override fun onStop() {
super.onStop()
// Delegate the save operation to the ViewModel, which handles the
// background thread operations (e.g., using Kotlin Coroutines and Room).
noteViewModel.saveDraft()
}
Etkinliğiniz Durduruldu durumuna girdiğinde Activity nesnesi bellekte tutulur: Tüm durum ve üye bilgilerini korur ancak pencere yöneticisine bağlı değildir. Etkinlik devam ettiğinde bu bilgileri geri çağırır.
Durduruldu durumundan sonra etkinlik, kullanıcıyla etkileşim kurmak için geri döner veya etkinliğin çalışması tamamlanır ve etkinlik kaybolur. Etkinlik geri gelirse sistem onRestart yöntemini çağırır. Activity çalışmayı tamamladıysa sistem onDestroy yöntemini çağırır.
onDestroy
onDestroy, etkinlik yok edilmeden önce çağrılır. Sistem, bu geri çağırma işlevini iki nedenden biriyle çağırır:
- Kullanıcı etkinliği tamamen kapattığı veya etkinlikte
finishçağrıldığı için etkinlik sonlandırılıyor. - Sistem, cihazın döndürülmesi veya çoklu pencere moduna girilmesi gibi bir yapılandırma değişikliği nedeniyle etkinliği geçici olarak sonlandırıyor.
Etkinlik, yok edilmiş durumuna geçtiğinde etkinliğin yaşam döngüsüne bağlı olan tüm yaşam döngüsüne duyarlı bileşenler ON_DESTROY etkinliğini alır. Yaşam döngüsü bileşenleri, Activity yok edilmeden önce temizlemeleri gereken her şeyi burada temizleyebilir.
öğenizin neden yok
edildiğini belirlemek için mantığı Activity öğenize yerleştirmek yerine, Activity öğenizle ilgili görünüm verilerini içeren bir ViewModel nesnesi kullanın. Activity, yapılandırma değişikliği nedeniyle yeniden oluşturulursa
ViewModel'nın herhangi bir işlem yapması gerekmez. Çünkü korunur ve
bir sonraki Activity örneğine verilir.
Activity yeniden oluşturulmazsa ViewModel, onCleared yöntemini çağırır. Bu yöntem, yok edilmeden önce temizlemesi gereken tüm verileri temizleyebilir. isFinishing yöntemini kullanarak bu iki senaryoyu birbirinden ayırt edebilirsiniz.
Etkinlik tamamlanıyorsa onDestroy, etkinliğin aldığı son yaşam döngüsü geri çağırma yöntemidir. onDestroy, bir yapılandırma değişikliği sonucunda çağrılırsa sistem hemen yeni bir etkinlik örneği oluşturur ve ardından yeni yapılandırmadaki bu yeni örnekte onCreate yöntemini çağırır.
onDestroy geri çağırma işlevi, onStop gibi önceki geri çağırma işlevleri tarafından serbest bırakılmayan tüm kaynakları serbest bırakır.
Etkinlik durumu ve bellekten çıkarma
Sistem, RAM'de yer açması gerektiğinde işlemleri sonlandırır. Sistemin belirli bir işlemi sonlandırma olasılığı, işlemin o andaki durumuna bağlıdır. İşlem durumu ise işlemde çalışan etkinliğin durumuna bağlıdır. Tablo 1'de işlem durumu, etkinlik durumu ve sistemin işlemi sonlandırma olasılığı arasındaki korelasyonlar gösterilmektedir. Bu tablo yalnızca bir işlem, diğer uygulama bileşeni türlerini çalıştırmıyorsa geçerlidir.
Öldürülme olasılığı |
İşlem durumu |
Son etkinlik durumu |
En düşük |
Ön plan (odaklanmış veya odaklanmak üzere) |
Devam ettirildi |
Düşük |
Görünür (odaklanma yok) |
Başlatıldı/Duraklatıldı |
Daha yüksek |
Arka plan (görünmez) |
Durduruldu |
En yüksek |
Boş |
Kaldırıldı |
Tablo 1. İşlem yaşam döngüsü ile etkinlik durumu arasındaki ilişki.
Sistem, bellekte yer açmak için hiçbir etkinliği doğrudan sonlandırmaz. Bunun yerine, etkinliğin çalıştığı işlemi sonlandırarak yalnızca etkinliği değil, işlemde çalışan diğer her şeyi de yok eder. Sistem tarafından başlatılan işlem sonlandırma gerçekleştiğinde etkinliğinizin kullanıcı arayüzü durumunu nasıl koruyacağınızı ve geri yükleyeceğinizi öğrenmek için durumu kaydetme ve geri yükleme ile ilgili bölüme bakın.
Kullanıcı, Ayarlar'daki Uygulama Yöneticisi'ni kullanarak ilgili uygulamayı sonlandırıp bir işlemi de sonlandırabilir.
İşlemler hakkında daha fazla bilgi için İşlemlere ve iş parçacıklarına genel bakış başlıklı makaleyi inceleyin.
Geçici kullanıcı arayüzü durumunu kaydetme ve geri yükleme
Kullanıcılar, döndürme veya çoklu pencere moduna geçme gibi yapılandırma değişiklikleri sırasında etkinliğin kullanıcı arayüzü durumunun aynı kalmasını bekler. Ancak sistem, bu tür bir yapılandırma değişikliği gerçekleştiğinde etkinliği varsayılan olarak yok eder ve etkinlik örneğinde depolanan tüm kullanıcı arayüzü durumlarını siler.
Benzer şekilde, kullanıcı geçici olarak uygulamanızdan başka bir uygulamaya geçip daha sonra uygulamanıza geri dönerse kullanıcı arayüzü durumunun aynı kalmasını bekler. Ancak kullanıcı uzaktayken ve etkinliğiniz durdurulmuşken sistem, uygulamanızın işlemini sonlandırabilir.
Sistem kısıtlamaları etkinliği yok ettiğinde ViewModel (karmaşık iş mantığı ve ekran durumu için), Jetpack Compose rememberSaveable API'si (hafif kullanıcı arayüzü durumu için) ve/veya yerel depolama alanını birlikte kullanarak kullanıcının geçici kullanıcı arayüzü durumunu koruyun. Sistem davranışına kıyasla kullanıcı beklentileri ve sistem tarafından başlatılan etkinlik ve işlem sonlandırma sırasında karmaşık kullanıcı arayüzü durum verilerini en iyi şekilde nasıl koruyacağınız hakkında daha fazla bilgi edinmek için Kullanıcı arayüzü durumlarını kaydetme başlıklı makaleyi inceleyin.
rememberSaveable, durumu arka planda paketleyerek hem yapılandırma değişikliklerinden hem de sistem tarafından başlatılan işlem sonlandırmadan otomatik olarak etkilenmez. Böylece, etkinlik düzeyinde standart kodlara gerek kalmadan sorunsuz bir deneyim sunar.
Örnek durumu
Kullanıcının Geri düğmesine basması veya etkinliğinizin finish yöntemini çağırarak kendi imhasını işaret etmesi gibi normal uygulama davranışı nedeniyle etkinliğinizin imha edildiği birkaç senaryo vardır.
Kullanıcı Geri düğmesine bastığı veya etkinlik kendi kendine bittiği için etkinliğiniz yok edildiğinde, hem sistemin hem de kullanıcının bu Activity örneğiyle ilgili kavramı sonsuza kadar kaybolur. Bu senaryolarda kullanıcının beklentisi sistemin davranışıyla eşleşir ve yapmanız gereken ek bir işlem olmaz.
Ancak sistem, sistem kısıtlamaları (ör. yapılandırma değişikliği veya bellek baskısı) nedeniyle etkinliği yok ederse gerçek Activity örneği kaybolsa da sistem, etkinliğin var olduğunu hatırlar. Kullanıcı etkinliğe geri dönmeye çalışırsa sistem, etkinliğin yok edildiği andaki durumunu açıklayan bir dizi kayıtlı veriyi kullanarak etkinliğin yeni bir örneğini oluşturur.
Sistemin önceki durumu geri yüklemek için kullandığı kayıtlı verilere örnek durumu denir. Arka planda, anahtar/değer çiftlerinden oluşan bir koleksiyondur. Sistem, varsayılan olarak kullanıcı arayüzü yerleşiminizle ilgili temel bilgileri (ör. kullanıcı metin girişi veya kaydırma konumları) kaydetmek için örnek durumunu kullanır.
rememberSaveable kullanarak bu sistem davranışına bağlanırsınız. Etkinlik örneğiniz yok edilip yeniden oluşturulursa rememberSaveable ile sarmalanmış tüm kullanıcı arayüzü durumları, ek etkinlik düzeyinde kod gerekmeden otomatik olarak geri yüklenir.
Ancak etkinliğinizde muhtemelen geri yüklemek istediğiniz daha karmaşık durum bilgileri (ör. kullanıcı verileri, ağ yanıtları veya kullanıcının ilerleme durumunu izleyen üye değişkenleri) olacaktır. Örnek durumu mekanizması (ve dolayısıyla rememberSaveable), ana iş parçacığında serileştirme gerektirdiğinden ve sistem işlemi belleğini tükettiğinden, önemsiz miktardan daha fazla veri saklamak için uygun değildir.
Çok az miktarda veriden fazlasını korumak için Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı gibi kalıcı yerel depolama alanı, ViewModel sınıfı ve Compose state hoisting'i kullanarak birleşik bir yaklaşım benimseyin.
rememberSaveable kullanarak basit ve hafif kullanıcı arayüzü durumunu kaydetme
Etkinliğiniz durmaya başladığında sistem, durum bilgilerini bir örnek durum paketine kaydetmeye hazırlanır. Bu sistem davranışına bağlanmak için doğrudan composable işlevlerinizde rememberSaveable kullanırsınız.
rememberSaveable, kullanıcı metin girişi veya kaydırma konumları gibi geçici kullanıcı arayüzü durumunu otomatik olarak kaydeder ve etkinlik yeniden oluşturma sırasında geri yükler.
Özel, basit durum bilgilerini (ör. kullanıcının oyundaki ilerleme durumu) kaydetmek için rememberSaveable kullanarak durumunuzu bildirin. Compose çerçevesi, örnek durumu paketine serileştirme işlemini arka planda gerçekleştirir:
var userTypedQuery by rememberSaveable(typedQuery, stateSaver = TextFieldValue.Saver) { mutableStateOf( TextFieldValue(text = typedQuery, selection = TextRange(typedQuery.length)) ) }
Kullanıcı tercihleri veya veritabanı verileri gibi kalıcı verileri kaydetmek için etkinliğiniz ön plandayken uygun fırsatları değerlendirin. Böyle bir fırsat yoksa kalıcı verileri onStop yöntemi sırasında kaydedin.
Kaydedilen örnek durumunu kullanarak etkinlik kullanıcı arayüzü durumunu geri yükleme
Etkinliğiniz daha önce yok edildikten sonra yeniden oluşturulduğunda durum geri yükleme işlemi otomatik olarak gerçekleşir. rememberSaveable kullandığınızda açık bir geri yükleme mantığı yazmanız, boş paketleri kontrol etmeniz veya etkinlik geri çağırmalarını geçersiz kılmanız gerekmez. Durumunuzu başlatan ve kaydeden kod, etkinlik geri geldiğinde durumu sorunsuz bir şekilde geri yükler:
var userTypedQuery by rememberSaveable(typedQuery, stateSaver = TextFieldValue.Saver) { mutableStateOf( TextFieldValue(text = typedQuery, selection = TextRange(typedQuery.length)) ) }
Etkinlikler ve gezinme
Bir uygulama, kullanım ömrü boyunca ekranlar arasında birçok kez geçiş yapabilir. Örneğin, kullanıcı cihazın geri düğmesine dokunduğunda veya yeni bir hedef seçtiğinde bu geçişler gerçekleşir. Modern Android uygulamaları genellikle tek etkinlikli bir mimari kullanır.
Uygulamanız her ekran için yeni bir Activity başlatmak yerine tek bir Activity barındırır ve bu etkinlikteki birleştirilebilir ekranları değiştirmek için Navigation bileşenini kullanır.
Modern, Compose öncelikli gezinmeyi nasıl uygulayacağınızı öğrenmek için Jetpack Compose Navigation 3 kitaplığı kılavuzuna bakın.
Bir etkinliği başka bir etkinlikten başlatma
Bir etkinliğin bir noktada başka bir etkinlik başlatması gerekebilir. Bu ihtiyaç, örneğin bir uygulamanın mevcut ekrandan yeni bir ekrana geçmesi gerektiğinde ortaya çıkar.
Etkinliğinizin, başlatmak üzere olduğu yeni etkinlikten bir sonuç döndürmesini isteyip istemediğinize bağlı olarak yeni etkinliği startActivity yöntemini veya startActivityForResult yöntemini kullanarak başlatırsınız. Her iki durumda da bir Intent nesnesi iletirsiniz.
Intent nesnesi, başlatmak istediğiniz etkinliği tam olarak belirtir veya gerçekleştirmek istediğiniz işlemin türünü açıklar. Sistem, sizin için uygun etkinliği seçer. Bu etkinlik, farklı bir uygulamadan bile olabilir. Intent nesnesi, başlatılan etkinlik tarafından kullanılacak küçük miktarlarda veri de taşıyabilir. Intent sınıfı hakkında daha fazla bilgi için Intent'ler ve Intent Filtreleri başlıklı makaleyi inceleyin.
startActivity
Yeni başlatılan etkinliğin bir sonuç döndürmesi gerekmiyorsa mevcut etkinlik, startActivity yöntemini çağırarak yeni etkinliği başlatabilir.
Kendi uygulamanızda çalışırken genellikle bilinen bir etkinliği başlatmanız gerekir. Örneğin, aşağıdaki kod snippet'inde SignInActivity adlı bir etkinliğin nasıl başlatılacağı gösterilmektedir.
val context = LocalContext.current
Button(onClick = {
val intent = Intent(context, SignInActivity::class.java)
context.startActivity(intent)
}) {
Text("Sign In")
}
Harici etkinlikleri başlatma
Uygulama içi gezinme Navigation tarafından yönetilirken Activity zaman zaman başka etkinlikler başlatmanız gerekir. Bu genellikle web tarayıcısı açma, e-posta gönderme veya fotoğraf çekme gibi belirli bir işlemi gerçekleştirmek için harici bir uygulamadan yararlanmak istediğinizde gerçekleşir.
Bunu yapmak için gerçekleştirmek istediğiniz işlem türünü açıklayan bir Intent nesnesi kullanırsınız. Sistem de başka bir uygulamadan uygun etkinliği başlatır.
Örneğin, kullanıcının e-posta iletisi göndermesine izin vermek istiyorsanız aşağıdaki intent'i oluşturabilirsiniz:
val intent = Intent(Intent.ACTION_SEND).apply {
putExtra(Intent.EXTRA_EMAIL, recipientArray)
}
startActivity(intent)
Harici bir etkinlik başlatmanız ve sonuç almanız gerekiyorsa (ör. kamera uygulamasından fotoğraf çekmesini ve resmi döndürmesini isteme) desteği sonlandırılan startActivityForResult geri çağırma işlevi yerine modern Activity sonuç API'lerini kullanın.
Etkinlikleri koordine etme
Bir etkinlik başka bir etkinliği başlattığında her ikisi de yaşam döngüsü geçişleri yaşar. İlk etkinlik çalışmayı durdurur ve Duraklatıldı veya Durduruldu durumuna girerken diğer etkinlik oluşturulur. Bu etkinlikler diske veya başka bir yere kaydedilen verileri paylaşıyorsa ikinci etkinlik oluşturulmadan önce ilk etkinliğin tamamen durdurulmadığını anlamak önemlidir. Bunun yerine, ikinciyi başlatma süreci, ilki durdurma süreciyle çakışır.
Yaşam döngüsü geri çağırma yöntemlerinin sırası, özellikle iki etkinlik aynı işlemde (başka bir deyişle aynı uygulamada) olduğunda ve biri diğerini başlattığında iyi tanımlanır. A etkinliği, B etkinliğini başlattığında gerçekleşen işlemlerin sırası şu şekildedir:
- A etkinliğinin
onPauseyöntemi yürütülür. - B etkinliğinin
onCreate,onStartveonResumeyöntemleri sırayla yürütülür. B etkinliği artık kullanıcı odağına sahip. - A etkinliği artık ekranda görünmüyorsa
onStopyöntemi yürütülür.
Bu yaşam döngüsü geri çağırma yöntemi dizisi, bilgilerin bir etkinlikten diğerine geçişini yönetmenize olanak tanır.
Ek kaynaklar
Etkinlik yaşam döngüsü hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın: