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
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.
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şiklikleriActivity
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: eskiActivity
ö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ğilActivity
ö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ı nedeniyleActivity
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()
.