Yapılandırma değişikliklerini işleme

Bazı cihaz yapılandırmaları uygulama çalışırken değişebilir. Bunlardan bazıları: ancak liste bunlarla sınırlı değildir:

  • Uygulama görüntüleme boyutu
  • Ekran yönü
  • Yazı tipi boyutu ve genişliği
  • Yerel ayar
  • Koyu mod ve açık mod
  • Klavye kullanılabilirliği

Bu yapılandırma değişikliklerinin çoğu, bazı kullanıcı etkileşimleri nedeniyle gerçekleşir. Örneğin, Örneğin, cihazı döndürmek veya katlamak ekran alanı miktarını değiştirir kullanabilirsiniz. Aynı şekilde, yazı tipi boyutu gibi cihaz ayarlarını da değiştirmek, dil veya tercih edilen temanın oyundaki ilgili Configuration nesnesini tanımlayın.

Bu parametreler genellikle uygulamanızın kullanıcı arayüzünde yeterince büyük değişiklikler yapılmasını gerektirir özel olarak tasarlanmış bir mekanizmaya sahiptir. Bu mekanizma Activity yeniden oluşturmadır.

Aktivite ve rekreasyon

Bir yapılandırma değişikliği gerçekleştiğinde sistem bir Activity öğesini yeniden oluşturur. Bunun için sistem onDestroy() çağrısı yapar ve mevcut Activity örneğini kaldırır. O zaman onCreate() kullanarak yeni bir örnek oluşturur ve bu yeni Activity örneği yeni ve güncellenmiş yapılandırmayla başlatıldı. Bu aynı zamanda sistemin kullanıcı arayüzünü yeni yapılandırmayla yeniden oluşturur.

Yeniden oluşturma davranışı, uygulamanızın yeni yapılandırmalara uyum sağlamasına eşleşen alternatif kaynaklarla uygulamanızı otomatik olarak yeniden yükleme yeni cihaz yapılandırmasını gözden geçirin.

Rekreasyon örneği

Statik başlık gösteren bir TextView kullanabilirsiniz: android:text="@string/title", düzen XML dosyasında tanımlandığı gibi. Görüntünün oluşturulduğunda, metni mevcut dile göre tam olarak bir kez ayarlar. Öğe sistem, etkinliği yeniden oluşturur. Bunun sonucunda sistem, görünümü yeniden oluşturur ve yeni dili'ne dokunun.

Yeniden oluşturma işlemi, Activity veya içerdiği Fragment, View ya da diğer nesnelerinde bulunabilir. Bu Activity yeniden oluşturma işleminin, Activity öğesinin tamamen yeni bir örneğini oluşturması ve kullanıcı arayüzü. Dahası, eski Activity artık görünür veya geçerli değildir. Bu nedenle veya içerdiği nesnelere yönelik kalan referanslar eskidir. Bir sorunun hatalar, bellek sızıntıları ve kilitlenmeler.

Kullanıcı beklentileri

Bir uygulamanın kullanıcısı, durumun korunmasını bekliyor. Kullanıcı bir form dolduruyorsa ve bilgiye referans vermesi için başka bir uygulamayı çoklu pencere modunda açarsa kötü bir kullanıcı deneyimi sağlar, temiz bir forma geri dönerse veya uygulamada tamamen başka bir yere koyabilirsiniz. Geliştirici olarak tutarlı bir kullanıcı deneyimi sunmanız gerekir. Böylece yapılandırma değişiklikleri ve etkinlik yeniden oluşturma gibi işlemleri yürütebilirsiniz.

Uygulamanızda durumun korunup korunmadığını doğrulamak için şunları yapabilirsiniz: hem uygulama ön plandayken hem de yapılandırma değişikliklerine neden olan işlemler arka planda çalışıyor. Bu işlemler aşağıdakileri içerir:

  • Cihazı döndürme
  • Çoklu pencere moduna geçiliyor
  • Çoklu pencere modundayken veya serbest biçimli bir pencerede uygulamayı yeniden boyutlandırma
  • Birden fazla ekrana sahip katlanabilir cihazı katlama
  • Sistem temasını değiştirme (ör. koyu mod veya açık mod)
  • Yazı tipi boyutunu değiştirme
  • Sistem veya uygulama dilini değiştirme
  • Donanım klavyesini bağlama veya klavyesinin bağlantısını kesme
  • Yuvaya bağlanma veya yuvanın bağlantısını kesme
ziyaret edin.

Söz konusu durumu korumak için uygulayabileceğiniz üç temel yaklaşım vardır: Activity yeniden değerlendirme. Hangisinin kullanılacağı, kontrol etmek istediğiniz eyaletin türüne koru:

  • Karmaşık veya büyük verilerin işlem ölümünü ele almak için yerel kalıcılık. Kalıcı yerel depolama alanları arasında veritabanları veya DataStore yer alır.
  • Kullanıcı arayüzüyle ilgili durumu işlemek için ViewModel örnekleri gibi saklanan nesneler kullanıcı uygulamayı aktif olarak kullanırken hafızaya alabilir.
  • Kayıtlı örnek durumu, sistem tarafından başlatılan işlem ölümünü işleme almak ve kullanıcı girişine veya gezinmeye bağlı geçici durum.

Bunların her birine yönelik API'lar hakkında ayrıntılı bilgi edinmek için Uygun olduğunda Kullanıcı arayüzü durumlarını kaydetme bölümüne bakın.

Aktiviteyi yeniden düzenleme

Belirli yapılandırma değişiklikleri için otomatik etkinlik yeniden oluşturmayı engelleyebilirsiniz. Activity yeniden oluşturma işlemi, kullanıcı arayüzünün ve türetilen nesnelerin yeniden oluşturulmasıyla sonuçlanır Activity arasında. Bundan kaçınmak için geçerli nedenleriniz olabilir. Örneğin, Örneğin, belirli bir aşamada uygulamanızın kaynakları güncellemesi veya performans sınırınız olabilir. Böyle bir durumda, etkinliğinizin yapılandırma değişikliğinin kendisini yönettiğini beyan edebilirsiniz. sistemin etkinliğinizi yeniden başlatmasını önleyin.

Belirli yapılandırma değişiklikleri için etkinlik yeniden oluşturmayı devre dışı bırakmak istiyorsanız android:configChanges içine yapılandırma türünü AndroidManifest.xml dosyanızda <activity> giriş var. Olası değerler android:configChanges özelliğine ilişkin dokümanlara göz atın.

Aşağıdaki manifest kodu, şu durumlarda MyActivity için Activity yeniden oluşturma işlemini devre dışı bırakır: Ekran yönü ve klavye kullanılabilirliği değişikliği:

<activity
    android:name=".MyActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
    android:label="@string/app_name">

Bazı yapılandırma değişiklikleri her zaman etkinliğin yeniden başlatılmasına neden olur. Devre dışı bırakamazsınız gerekir. Örneğin, dinamik renk değişikliğini devre dışı bırakamazsınız. .

View sistemindeki yapılandırma değişikliklerine tepki verme

View sisteminde, mevcut anahtar kelimelerinizi içeren bir yapılandırma değişikliği Activity yeniden oluşturma devre dışı bırakılırsa etkinlik Activity.onConfigurationChanged(). Ayrıca, ekli tüm görünümler View.onConfigurationChanged() çağrısı. Yapılandırma değişiklikleri için android:configChanges hedefine eklenmediyse sistem, etkinliği yeniden oluşturur olduğu gibi.

onConfigurationChanged() geri çağırma yöntemi, Yeni cihaz yapılandırmasını belirten Configuration nesnesi. Okunanlar yeni nesnenizin ne olacağını belirlemek için Configuration nesnesindeki alanları yeterli olduğunu unutmayın. Daha sonraki değişiklikleri yapmak için kaynakları güncelleyin bir arada kullanabilirsiniz. Sistem bu yöntemi çağırdığında, etkinliğiniz Resources nesnesi, yeni yapılandırma. Bu, sistem olmadan kullanıcı arayüzünüzün öğelerini sıfırlamanıza olanak tanır. etkinliğinizi yeniden başlatmayı deneyin.

Örneğin, aşağıdaki onConfigurationChanged() uygulama kontrolleri mevcut bir klavye olup olmadığını kontrol edin:

Kotlin

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    // Checks whether a keyboard is available
    if (newConfig.keyboardHidden === Configuration.KEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "Keyboard available", Toast.LENGTH_SHORT).show()
    } else if (newConfig.keyboardHidden === Configuration.KEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "No keyboard", Toast.LENGTH_SHORT).show()
    }
}

Java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks whether a keyboard is available
    if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "Keyboard available", Toast.LENGTH_SHORT).show();
    } else if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO){
        Toast.makeText(this, "No keyboard", Toast.LENGTH_SHORT).show();
    }
}

Uygulamanızı bu yapılandırmaya dayalı olarak güncellemeniz gerekmiyorsa durumunda, onConfigurationChanged() uygulamasını uygulayamazsınız. Bu yapılandırma değişikliğinden önce kullanılan tüm kaynaklar hâlâ kullanılıyorsa, ve yalnızca etkinliğinizin yeniden başlatılmasını önlersiniz. Örneğin TV uygulaması Bluetooth klavye bağlandığında veya çıkarıldığında tepki vermek istemeyebilir.

Durumu koru

Bu tekniği kullandığınızda normal süre boyunca yaşam döngüsü boyunca geçerlidir. Bunun nedeni aşağıdakilerden biridir:

  • Kaçınılmaz değişiklikler: Önleyemediğiniz yapılandırma değişiklikleri, uygulamanızı yeniden başlatın.
  • İşlem ölümü: Uygulamanız, sistem tarafından başlatılan işlemleri işleyebilmelidir çok önemlidir. Kullanıcı uygulamanızdan ayrılır ve uygulama sistem uygulamayı yok edebilir.
ziyaret edin. sırasında her bir öğeye kaynak ekleyin.

Jetpack Compose'daki yapılandırma değişikliklerine tepki verme

Jetpack Compose, uygulamanızın yapılandırma değişikliklerine daha kolay tepki vermesini sağlar. Ancak, tüm yapılandırma değişiklikleri için Activity yeniden oluşturma ayarını devre dışı bırakırsanız emin olmak istiyorsanız, uygulamanız gereken şekilde yapılandırma değişiklikleridir.

Configuration nesnesi, Compose kullanıcı arayüzü hiyerarşisinde LocalConfiguration bestesi yerel. Değiştiğinde, LocalConfiguration.current yeniden oluşturma deneyiminden okuma yapan composable işlevler. Örneğin, beste yerel bölgelerinin işleyiş şekli hakkında daha fazla bilgi için Yerel kapsamlı verilerinin CompositionLocal ile aynıdır.

Örnek

Aşağıdaki örnekte, bir composable belirli biçimde bir tarih gösterir. composable, sistem yerel ayar değişikliklerine şu çağrıyı yaparak tepki verir: LocalConfiguration.current ile ConfigurationCompat.getLocales().

@Composable
fun DateText(year: Int, dayOfYear: Int) {
    val dateTimeFormatter = DateTimeFormatter.ofPattern(
        "MMM dd",
        ConfigurationCompat.getLocales(LocalConfiguration.current)[0]
    )
    Text(
        dateTimeFormatter.format(LocalDate.ofYearDay(year, dayOfYear))
    )
}

Yerel ayar değiştiğinde Activity yeniden oluşturulmaması için Activity Yazma kodu, yerel ayar yapılandırma değişikliklerini devre dışı bırakmalıdır. Bunun için, android:configChanges değerini locale|layoutDirection olarak ayarla.

Yapılandırma değişiklikleri: Temel kavramlar ve en iyi uygulamalar

Bunlar, yapılandırma üzerinde çalışırken bilmeniz gereken temel kavramlardır. değişiklikler:

  • Yapılandırmalar: Cihaz yapılandırmaları, kullanıcı arayüzünün (uygulama görüntüleme boyutu, yerel ayar veya sistem teması gibi) kullanıcıya göre değişir.
  • Yapılandırma değişiklikleri: Yapılandırmalar kullanıcı etkileşimi yoluyla değişir. Örneğin, Örneğin, kullanıcı cihaz ayarlarını veya fiziksel olarak etkileşim kurma şeklini değiştirebilir. bu bilgileri kontrol edelim. Bu durumu önlemenin bir yolu yapılandırma değişiklikleridir.
  • Activity yeniden oluşturma: yapılandırma değişiklikleri Activity yeniden oluşturulmayla sonuçlanıyor varsayılan olarak. Bu, yeni yapılandırma.
  • Activity yok etme: Activity yeniden oluşturma, sistemin şu öğeyi yok etmesine neden olur: eski Activity örneğini oluşturun ve onun yerine yeni bir tane oluşturun. Eski örnek geçerliliğini yitirmişti. Bu öğeye yapılan kalan referanslar bellek sızıntılarına neden olur, olabilir.
  • Durum: Eski Activity örneğindeki durum yenide mevcut değil Activity örneğidir. Çünkü bunlar iki farklı nesne örneğidir. Koru Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı gibi uygulamanın ve kullanıcının durumuna.
  • Devre dışı bırakma: Bir yapılandırma türü için etkinlik yeniden oluşturma özelliğini devre dışı bırakma potansiyel bir optimizasyondur. Uygulamanızın bu özellikleri gerektiği gibi güncellenir.

İyi bir kullanıcı deneyimi sağlamak için aşağıdaki en iyi uygulamaları dikkate alın:

  • Sık sık yapılandırma değişikliklerine hazırlıklı olun: Yapılandırma değişikliklerinin büyük olasılıkla veya kullanıcı arayüzü araç seti fark etmeksizin nadiren görülür ya da hiçbir zaman yaşanmayacaktır. Bir kullanıcı, yapılandırma değişikliğine neden olduğunda uygulamaların güncellenmesini bekler. yeni yapılandırmayla düzgün çalışmaya devam edebilir.
  • Durumu koru: Activity yeniden oluşturma işlemi sırasında kullanıcının durumunu kaybetmeyin gerçekleşir. Durumu, Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı gibi koruyun.
  • Hızlı bir çözüm olarak devre dışı bırakmayın: Activity yeniden oluşturma özelliğini devre dışı bırakmayın kullanabilirsiniz. Aktiviteyi yeniden oluşturma özelliğini devre dışı bırakmak için: siz de değişikliği ele alma vaadini yerine getirirsiniz. Ancak yine de diğer yapılandırma değişikliklerinden yeniden oluşturulması nedeniyle Activity durum, işlem veya uygulamayı kapatmak. Activity hizmetini tamamen devre dışı bırakmak mümkün değildir rekreasyon. Durumu, Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı gibi koruyun.
  • Yapılandırma değişikliklerinden kaçının: yön konusunda kısıtlama uygulamayın, veya yeniden boyutlandırılabilmeyi sağlayan en boy oranı ya da yapılandırma Activity rekreasyon. Bu durum, uygulamanızı kullanmak isteyen kullanıcıları olumsuz yönde etkiler. tercih edebilirler.

Boyuta dayalı yapılandırma değişikliklerini işleme

Boyuta dayalı yapılandırma değişiklikleri herhangi bir zamanda olabilir ve büyük olasılıkla Uygulamanız kullanıcıların giriş yapabileceği büyük ekranlı bir cihazda çalıştığında çoklu pencere moduna girebilirsiniz. Uygulamanızın bu konuda iyi performans göstermesini bahsedeceğim.

İki genel boyut değişikliği türü vardır: önemli ve önemlidir. Önemli bir boyut değişikliği, farklı bir öğe grubunun arasındaki fark nedeniyle yeni yapılandırmada alternatif kaynaklar (ör. genişlik, yükseklik veya en küçük genişlik) seçin. Bu kaynaklar şunlardır: uygulamanın kendisini tanımladığı ve kitaplıklarından herhangi birinden gelenler.

Boyuta dayalı yapılandırma değişiklikleri için etkinlik yeniden oluşturmayı kısıtlama

Boyuta dayalı yapılandırma değişiklikleri için Activity yeniden oluşturmayı devre dışı bıraktığınızda sistem, Activity öğesini yeniden oluşturmaz. Bunun yerine, Activity.onConfigurationChanged(). Ekli görüntülemeler şuna çağrı alır: View.onConfigurationChanged().

Aşağıdaki durumlarda boyuta dayalı yapılandırma değişiklikleri için Activity yeniden oluşturma devre dışı bırakılır şu var android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout inç manifest dosyanıza ekleyin.

Boyuta dayalı yapılandırma değişiklikleri için etkinlik yeniden oluşturmaya izin ver

Android 7.0 (API düzeyi 24) ve sonraki sürümlerde Activity yeniden oluşturma işlemi yalnızca boyuta dayalı yapılandırmanın değişmesine yardımcı olur. Sistem, yetersiz boyut nedeniyle bir Activity yeniden oluşturulursa sistem, Activity.onConfigurationChanged() ve Bunun yerine View.onConfigurationChanged().

Activity ve View ile ilgili olarak dikkate alınması gereken bazı uyarılar vardır Activity yeniden oluşturulmadığında geri çağırmalar:

  • Android 11 (API düzeyi 30) ile Android 13 (API düzeyi 33) arasındaki sürümlerde Activity.onConfigurationChanged() telefon edilmedi.
  • View.onConfigurationChanged() değerinin bilinmeyen olabileceği, bilinen bir sorun vardır Android 12L'de (API düzeyi 32) ve önceki sürümlerde Android 13 (API düzeyi 33). Daha fazla bilgi için bu herkese açık soruna göz atın. Bu sorun daha sonraki Android 13 sürümlerinde ve Android 14'te giderilmiştir.

Boyuta dayalı yapılandırmayı dinlemeye bağlı kodlar için geçersiz kılınmış bir View yardımcı programı kullanmanızı öneririz Activity yeniden oluşturma ya daView.onConfigurationChanged() Activity.onConfigurationChanged().