Etkinlik yaşam döngüsü

Kullanıcı uygulamanızda gezinirken, uygulamadan çıkarken ve uygulamaya geri dönerken uygulamanızdaki Activity örnekleri, yaşam döngülerinde farklı durumlara geçer. Activity sınıfı, etkinliğin bir durumun değiştiğini veya sistemin bir etkinliği oluşturduğunu, durdurduğunu ya da devam ettirdiğini veya etkinliğin bulunduğu işlemi yok ettiğini bilmesini sağlayan bir dizi geri çağırma sağlar.

Yaşam döngüsü geri çağırma yöntemlerinde, kullanıcı etkinliği terk edip yeniden girdiğinde etkinliğinizin nasıl davranacağını belirtebilirsiniz. Örneğin, bir akış video oynatıcı oluşturuyorsanız kullanıcı başka bir uygulamaya geçtiğinde videoyu duraklatabilir ve ağ bağlantısını sonlandırabilirsiniz. Kullanıcı geri döndüğünde ağa yeniden bağlanabilir ve kullanıcının videoyu aynı noktadan devam ettirmesine izin verebilirsiniz.

Her geri çağırma, belirli bir durum değişikliğine uygun özel bir çalışma yapmanıza olanak tanır. Doğru zamanda doğru işi 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ğırmalarının 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 uygulamanın kilitlenmesi.
  • Kullanıcı etkin olarak kullanmadığı zaman değerli sistem kaynaklarını tüketir.
  • Kullanıcılar uygulamanızdan çıkıp daha sonra geri döndüğünde ilerlemelerini kaybetme
  • Ekran yatay ve dikey yön arasında döndürüldüğünde uygulamanın kilitlenmesi 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, geri çağırmaların her biri açıklanır: 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 sürecin sistem tarafından sonlandırılmaya karşı savunmasızlığı arasındaki ilişki kısaca açıklanır. Son olarak, etkinlik durumları arasındaki geçişlerle ilgili çeşitli konular ele alınır.

En iyi uygulamalarla ilgili yönergeler de dahil olmak üzere yaşam döngülerini işleme hakkında bilgi edinmek 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ı

Etkinlik yaşam döngüsünün aşamaları arasındaki geçişlerde gezinmek için Activity sınıfı, temel bir geri çağırma grubu 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 sunulmaktadır.

Şekil 1. Etkinlik yaşam döngüsünün basitleştirilmiş bir resmi.

Kullanıcı etkinlikten ayrılmaya başladığında sistem, etkinliği kaldırmak için yöntemleri çağırır. Bazı durumlarda, etkinlik yalnızca kısmen kaldırılır ve kullanıcı başka bir uygulamaya geçtiğinde olduğu gibi bellekte kalmaya devam eder. Bu durumlarda etkinlik, ön plana geri 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 içindeki etkinlikleri sonlandırma olasılığı, etkinliğin o sıradaki durumuna bağlıdır. Durum ile bellekten çıkarma hassasiyeti arasındaki ilişki hakkında daha fazla bilgi için Etkinlik durumu ve bellekten çıkarma bölümüne bakın.

Etkinliğinizin karmaşıklığına bağlı olarak, yaşam döngüsü yöntemlerinin tümünü uygulamanız gerekmeyebilir. Ancak her birini anlamanız ve uygulamanız önemlidir. Bu sayede uygulamanız, kullanıcıların beklediği şekilde çalışır.

Compose ve Yaşam Döngüsü

Oluşturma işleminde, işletme mantığını veya manuel gözlemci kurulumunu doğrudan onStart ya da onResume gibi etkinlik geri çağırmaları içine yerleştirmeyin. Bunun yerine, yaşam döngüsüne duyarlı efektler ve durum duyarlı gözlemciler kullanın. Bu efektler ve gözlemciler, kullanıcı arayüzünün ekrandaki varlığıyla otomatik olarak hizalanır.

  • Yaşam döngüsüne duyarlı toplama: collectAsStateWithLifecycle kullanarak ViewModel akışlarını kullanın. Bu API, kullanıcı arayüzü Başlatıldı durumuna girdiğinde otomatik olarak veri 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 kodu çalıştırmak için LifecycleEffects kullanabilirsiniz.
  • Mantık akışı: Bu API'ler kullanıldığında kullanıcı arayüzü, bileşim ağacı aracılığıyla yaşam döngüsü durumuna doğal olarak tepki verir. Böylece, iş mantığının yalnızca kullanıcı bileşenle aktif olarak etkileşim kurduğunda yürütülmesi sağlanı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ğırmaları

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şenin yaşam döngüsünden haberdar olması gerekir. Bağımlı bileşenlerinizin yaşam döngüsüne duyarlı olmasını nasıl sağlayacağınızı öğrenmek için Jetpack Compose'da Yaşam Döngüsü başlıklı makaleyi inceleyin.

onCreate

Sistem etkinliği ilk kez 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ı boyunca yalnızca bir kez gerçekleşen temel uygulama başlatma mantığını uygulayın.

Örneğin, onCreate öğesini uyguladığınızda veriler listelere bağlanabilir, etkinlik bir ViewModel ile ilişkilendirilebilir ve bazı sınıf kapsamlı değişkenler oluşturulabilir. Bu yöntem, etkinliğin daha önce kaydedilmiş durumunu içeren bir Bundle nesnesi olan savedInstanceState parametresini alır. Etkinlik daha önce hiç yoksa Bundle nesnesinin değeri null olur.

Etkinliğinizin yaşam döngüsüne bağlı, yaşam döngüsünden haberdar bir bileşeniniz varsa ON_CREATE etkinliğini alır. @OnLifecycleEvent ile açıklama eklenmiş yöntem, yaşam döngüsünden haberdar bileşeninizin oluşturulan durum için ihtiyaç duyduğu kurulum kodunu çalıştırabilmesi amacıyla çağrılır.

Aşağıdaki örnekte, Text composable'ın minimum düzeyde bir 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öntemi yürütmeyi tamamladıktan sonra etkinlik Başlatıldı durumuna girer ve sistem, onStart ve onResume yöntemlerini hızlı bir şekilde çağırır.

onStart

Etkinlik Başlatıldı durumuna girdiğinde sistem onStart işlevini çağırır. Bu çağrı, uygulama etkinliğin ön plana çıkıp etkileşimli hale gelmesine hazırlanırken etkinliği kullanıcıya görünür kılar. Örneğin, bu yöntemde kullanıcı arayüzünü koruyan kod başlatılır.

Etkinlik Başlatıldı durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı tüm yaşam döngüsü farkında 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 işlemi tamamlandığında etkinlik Resumed durumuna girer ve sistem onResume yöntemini çağırır.

onResume

Etkinlik Devam Ediyor durumuna girdiğinde ön plana gelir ve sistem onResume geri çağırmasını başlatır. Bu, uygulamanın kullanıcıyla etkileşim kurduğu durumdur. Uygulama, odak noktasını uygulamadan uzaklaştıran bir olay (ör. cihazın telefon araması alması, kullanıcının başka bir etkinliğe gitmesi veya cihaz ekranının kapanması) gerçekleşene kadar bu durumda kalır.

Etkinlik, Devam Edildi durumuna geçtiğinde etkinliğin yaşam döngüsüne bağlı olan yaşam döngüsü farkında 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) etkinleştirebilir.

Kesintiye neden olan bir etkinlik gerçekleştiğinde etkinlik Duraklatıldı durumuna girer ve sistem onPause geri çağırmasını başlatır.

Etkinlik, Duraklatıldı durumundan Devam Ediyor durumuna dönerse sistem onResume yöntemini tekrar çağırır. Bu nedenle, onResume'ı uygulayarak onPause sırasında yayınladığınız bileşenleri başlatın ve etkinlik her Resumed durumuna girdiğinde yapılması gereken diğer tüm başlatma işlemlerini gerçekleştirin.

Aşağıda, bileşen ON_RESUME etkinliğini aldığında kameraya erişen yaşam döngüsü farkında bir bileşene örnek 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ıldı durumunda olsa bile tamamen görünür olabilir. Örneğin, uygulama çok pencereli moddayken ve 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ışken ancak görünür durumdayken (ör. çoklu pencere modunda) kamerayı etkin tutmak istiyorsanız kamerayı ON_START etkinliğinden sonra başlatın.

Ancak etkinliğiniz Duraklatılmış durumdayken kameranın etkin olması, çoklu pencere modunda başka bir Devam Ettirilen uygulamanın kameraya erişmesini engelleyebilir. Bazen etkinliğiniz duraklatılmışken kamerayı etkin tutmanız gerekebilir ancak bunu yaparsanız genel kullanıcı deneyimi kötüleşebilir.

Bu nedenle, çok pencereli mod bağlamında paylaşılan sistem kaynaklarının kontrolünü yaşam döngüsünün hangi aşamasında almanın en uygun olacağını 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.

Hangi hazırlık etkinliğinde başlatma işlemi yapmayı seçerseniz seçin, kaynağı serbest bırakmak için ilgili yaşam döngüsü olayı kullandığınızdan emin olun. ON_START etkinliğinden sonra bir şeyi başlatırsanız ON_STOP etkinliğinden sonra yayınlayı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, kamera başlatma kodunu yaşam döngüsünden haberdar 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 ve yaşam döngüsüne duyarlı bir bileşene ekleyerek kodu çoğaltmak zorunda kalmadan bileşeni birden fazla etkinlikte yeniden kullanabilirsiniz. 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ı makaleye bakın.

onPause

Sistem, bu yöntemi kullanıcının etkinliğinizden ayrıldığına dair ilk gösterge olarak çağırır ancak bu, etkinliğin her zaman yok edildiği anlamına gelmez. Bu, etkinliğin artık ön planda olmadığını ancak kullanıcı çok pencereli moddaysa hala görünür olduğunu gösterir. Bir etkinliğin bu duruma girmesinin çeşitli nedenleri olabilir:

  • onResume geri çağırma bölümünde açıklandığı gibi, uygulama yürütmesini kesintiye uğratan bir etkinlik, mevcut etkinliği duraklatır. Bu, en yaygın durumdur.
  • Çoklu pencere modunda, herhangi bir zamanda yalnızca bir uygulama odaklanabilir 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 ön planda 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ü farkında 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 işlevleri (ör. kamera önizlemesini durdurma) burada durdurabilir.

Activity Duraklatılmış durumdayken devam edemeyen veya ılımlı bir şekilde devam edebilecek işlemleri duraklatmak ya da ayarlamak için onPause yöntemini kullanın. Bu işlemlerin kısa süre içinde devam etmesini beklersiniz.

Ayrıca, etkinliğiniz duraklatılmışken ve kullanıcının bunlara ihtiyacı yokken sistem kaynaklarını, sensörlere (ör. GPS) yönelik tutamaçları veya pil ömrünü etkileyen kaynakları serbest bırakmak için onPause yöntemini de kullanabilirsiniz.

Ancak onResume ile ilgili bölümde belirtildiği gibi, uygulama çok pencereli moddaysa duraklatılmış bir etkinlik yine de tamamen görünür olabilir. Kullanıcı arayüzüyle ilgili kaynakları ve işlemleri çoklu pencere modunu daha iyi destekleyecek şekilde tamamen yayınlamak veya ayarlamak için onPause yerine onStop kullanmayı düşünebilirsiniz.

Aşağıdaki ON_PAUSE etkinliğine tepki veren 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 yayın kodu ON_PAUSE etkinliği LifecycleObserver tarafından alındıktan sonra yerleştirilir.

onPause yürütme işlemi çok kısa sürer 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ştirilebilecek uygun işlemler hakkında daha fazla bilgi için sonraki bölüme bakın. Verileri kaydetme hakkında daha fazla bilgi için durumu kaydetme ve geri yükleme bölümüne bakın.

onPause yönteminin tamamlanması, etkinliğin Duraklatıldı durumundan çıktığı anlamına gelmez. Bunun yerine, etkinlik devam edene veya kullanıcı için tamamen görünmez hale gelene kadar bu durumda kalır. Etkinlik devam ederse sistem onResume geri çağırma işlevini tekrar çağırır.

Etkinlik Duraklatıldı durumundan Devam Ediyor durumuna dönerse sistem, Activity örneğini bellekte tutar ve sistem onResume öğesini çağırdığında bu örneği geri çağırır. Bu senaryoda, Devam Edildi durumuna kadar olan geri çağırma yöntemleri sırasında oluşturulan bileşenleri yeniden başlatmanız gerekmez. Etkinlik tamamen görünmez hale gelirse sistem onStop işlevini çağırır.

onStop

Etkinliğiniz kullanıcı tarafından artık görünmediğinde Durduruldu durumuna geçer ve sistem onStop geri çağırmasını başlatır. Bu durum, yeni başlatılan bir etkinlik ekranın tamamını kapladığında meydana gelebilir. Sistem, etkinlik çalışmayı bitirip sonlandırılmak üzereyken de onStop işlevini çağırır.

Etkinlik Durduruldu durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı yaşam döngüsü farkında olan tüm bileşenler ON_STOP etkinliğini alır. Yaşam döngüsü bileşenleri, bileşen ekranda görünmüyorken çalışması gerekmeyen işlevleri burada durdurabilir.

onStop yönteminde, uygulama kullanıcıya görünmüyorken ihtiyaç duyulmayan kaynakları serbest bırakın veya ayarlayın. Örneğin, uygulamanız animasyonları duraklatabilir veya ayrıntılı konum güncellemelerinden genel konum güncellemelerine geçebilir. onPause yerine onStop kullanmak, kullanıcı etkinliğinizi çok pencereli modda görüntülerken bile kullanıcı arayüzüyle ilgili çalışmaların devam etmesini sağlar.

Ayrıca, nispeten CPU yoğun kapatma işlemleri gerçekleştirmek için onStop kullanın. Örneğin, bilgileri veritabanına kaydetmek için daha iyi bir zaman bulamıyorsanı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 kalır: Tüm durum ve üye bilgilerini korur ancak pencere yöneticisine bağlı değildir. Etkinlik devam ettiğinde bu bilgiler hatırlanır.

Durduruldu durumunda etkinlik, kullanıcıyla etkileşim kurmak için geri döner veya etkinlik çalışmayı tamamlayıp kaybolur. Etkinlik geri gelirse sistem onRestart işlevini çağırır. Activity çalışması tamamlandığında sistem onDestroy'ı çağırır.

onDestroy

onDestroy, etkinlik yok edilmeden önce çağrılır. Sistem, bu geri çağırmayı iki nedenden biriyle çağırır:

  1. Kullanıcı etkinliği tamamen kapattığı veya etkinlikte finish çağrıldığı için etkinlik sona eriyor.
  2. Sistem, yapılandırma değişikliği (ör. cihazı döndürme veya çok pencereli moda girme) nedeniyle etkinliği geçici olarak yok ediyor.

Etkinlik yok edildi durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı yaşam döngüsünden haberdar tüm 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.

Activity öğenizin neden yok edildiğini belirlemek için mantık 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 korunup sonraki Activity örneğine verildiğinden herhangi bir işlem yapması gerekmez.

Activity yeniden oluşturulmazsa ViewModel, yok edilmeden önce temizlemesi gereken verileri temizleyebileceği onCleared yöntemini çağırır. isFinishing yöntemiyle bu iki senaryo arasında ayrım yapabilirsiniz.

Etkinlik sona eriyorsa 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'ı ç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'i boşaltması gerektiğinde işlemleri sonlandırır. Sistemin belirli bir işlemi sonlandırma olasılığı, işlemin o sıradaki durumuna bağlıdır. İşlem durumu da 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 başka türde uygulama bileşenleri ç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 olan)

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. Süreç yaşam döngüsü ile etkinlik durumu arasındaki ilişki.

Sistem, bellekte yer açmak için hiçbir zaman doğrudan bir etkinliği sonlandırmaz. Bunun yerine, etkinliğin çalıştığı işlemi sonlandırır. Bu durumda yalnızca etkinlik değil, işlemde çalışan diğer her şey de yok edilir. 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 bölümüne bakın.

Kullanıcı, Ayarlar'daki Uygulama Yöneticisi'ni kullanarak ilgili uygulamayı kapatıp işlemi sonlandırabilir.

Süreçler hakkında daha fazla bilgi için �Süreçlere 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 çok pencereli moda geçme gibi yapılandırma değişiklikleri sırasında etkinliklerin 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ü durumunu siler.

Benzer şekilde, kullanıcılar uygulamanızdan geçici olarak başka bir uygulamaya geçip daha sonra uygulamanıza geri döndüklerinde kullanıcı arayüzü durumunun aynı kalmasını bekler. Ancak kullanıcı uzaktayken ve etkinliğiniz durdurulmuşken sistem, uygulamanızın sürecini sonlandırabilir.

Sistem kısıtlamaları etkinliği kaldırdığında, ViewModel (karmaşık iş mantığı ve ekran durumu için), Jetpack Compose rememberSaveable API'si (basit kullanıcı arayüzü durumu için) ve/veya yerel depolama alanı kullanarak kullanıcının geçici kullanıcı arayüzü durumunu koruyun. Kullanıcı beklentileri ile sistem davranışı arasındaki farklar ve sistem tarafından başlatılan etkinlik ile süreç sonlandırma sırasında karmaşık kullanıcı arayüzü durumu verilerini en iyi şekilde koruma 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şikliklerine hem de sistem tarafından başlatılan işlem sonlandırmalarına otomatik olarak dayanır. Böylece, etkinlik düzeyinde standart kodlara gerek kalmadan sorunsuz bir deneyim sunar.

Örnek durumu

Etkinliğinizin normal uygulama davranışı nedeniyle yok edildiği birkaç senaryo vardır. Örneğin, kullanıcı Geri düğmesine bastığında veya etkinliğiniz finish yöntemini çağırarak kendi yok edilmesini işaret ettiğinde.

Kullanıcı Geri düğmesine bastığında veya etkinlik kendi kendine tamamlandığında etkinliğiniz yok edildiği için hem sistemin hem de kullanıcının Activity örneğiyle ilgili kavramı kalıcı olarak kaybolur. Bu senaryolarda kullanıcının beklentisi sistemin davranışı ile eşleşir ve sizin 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 kaybolur ancak sistem, bu örneğin var olduğunu hatırlar. Kullanıcı etkinliğe geri dönmeye çalıştığında sistem, etkinliğin yok edildiği sıradaki 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ığı kaydedilmiş verilere örnek durumu adı verilir. Bu, arka planda anahtar/değer çiftlerinden oluşan bir koleksiyondur. Varsayılan olarak sistem, kullanıcı metin girişi veya kaydırma konumları gibi kullanıcı arayüzü yerleşiminizle ilgili temel bilgileri 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ı otomatik olarak geri yüklenir. Bu işlem için etkinlik düzeyinde ek kod yazmanız gerekmez.

Ancak etkinliğinizde, geri yüklemek isteyeceğiniz daha karmaşık durum bilgileri (ör. kullanıcı verileri, ağ yanıtları veya kullanıcının ilerlemesini izleyen üye değişkenleri) olabilir. Örnek durumu mekanizması (ve dolayısıyla rememberSaveable), ana iş parçacığında serileştirme gerektirdiğinden ve sistem süreci belleğini tükettiğinden önemsiz miktardan daha fazla verinin korunması için uygun değildir.

Çok küçük bir veri miktarından fazlasını korumak için Save UI states (Kullanıcı arayüzü durumlarını kaydetme) bölümünde açıklandığı gibi kalıcı yerel depolama, ViewModel sınıfı ve Compose durumunu yükseltme yöntemlerini birlikte kullanın.

rememberSaveable kullanarak basit ve hafif kullanıcı arayüzü durumunu kaydetme

Etkinliğiniz durmaya başladığında sistem, durum bilgilerini bir örnek durumu paketine kaydetmeye hazırlanır. Bu sistem davranışına bağlanmak için doğrudan composable işlevlerinizde rememberSaveable kullanırsınız. rememberSaveable, etkinlik yeniden oluşturulurken kullanıcı metin girişi veya kaydırma konumları gibi geçici kullanıcı arayüzü durumunu otomatik olarak kaydeder ve 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, arka planda örnek durumu paketine serileştirme işlemini 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 oluşmazsa kalıcı verileri onStop yöntemi sırasında kaydedin.

Kayıtlı örnek durumunu kullanarak etkinlik kullanıcı arayüzü durumunu geri yükleme

Daha önce yok edilen etkinliğiniz yeniden oluşturulduğunda durum geri yükleme işlemi otomatik olarak yapılır. rememberSaveable kullandığınızda açıkça 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ş yapar. Örneğin, kullanıcı cihazın geri düğmesine dokunduğunda veya yeni bir hedef seçtiğinde. Modern Android uygulamaları genellikle tek etkinlikli 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 composable ekranları değiştirmek için Navigation bileşenini kullanır.

Modern ve Compose'a öncelik veren gezinmeyi nasıl uygulayacağınızı öğrenmek için Jetpack Compose Navigation 3 kitaplığı ile ilgili kılavuza bakın.

Bir etkinlikten başka bir etkinlik 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 sonuç alıp almayacağına bağlı olarak yeni etkinliği startActivity veya startActivityForResult yöntemini kullanarak başlatırsınız. Her iki durumda da Intent nesnesi iletirsiniz.

Intent nesnesi, başlatmak istediğiniz etkinliği tam olarak belirtir veya gerçekleştirmek istediğiniz işlem türünü açıklar. Sistem, sizin için uygun olan etkinliği seçer. Bu etkinlik farklı bir uygulamadan da 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 Amaçlar ve Amaç Filtreleri başlıklı makaleyi inceleyin.

startActivity

Yeni başlatılan etkinliğin sonuç döndürmesi gerekmiyorsa mevcut etkinlik, startActivity yöntemini çağırarak etkinliği başlatabilir.

Kendi uygulamanızda çalışırken genellikle bilinen bir etkinliği başlatmanız yeterlidir. Ö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 işlenirken Activity'ın zaman zaman başka etkinlikler başlatması gerekir. Bu durum genellikle bir 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 yaşanır.

Bunu yapmak için, gerçekleştirmek istediğiniz işlem türünü açıklamak üzere bir Intent nesnesi kullanırsınız ve sistem, 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 amaçları 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) kullanımdan kaldırılan startActivityForResult geri çağırma 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, ikinci görevi başlatma süreci, ilk görevi durdurma süreciyle çakışır.

Yaşam döngüsü geri çağırmalarının sırası, özellikle iki etkinlik aynı süreçte (yani 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ı şöyledir:

  1. A etkinliğinin onPause yöntemi yürütülür.
  2. B etkinliğinin onCreate, onStart ve onResume yöntemleri sırayla yürütülür. B etkinliği artık kullanıcı odağına sahip.
  3. A etkinliği artık ekranda görünmüyorsa onStop yöntemi yürütülür.

Bu yaşam döngüsü geri çağırma 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:

İçeriği görüntüleme