Bazı cihaz yapılandırmaları, uygulama çalışırken değişebilir. Bunlar aşağıdakilerle sınırlı olmamakla birlikte şunları kapsar:
- Uygulama görüntü boyutu
- Ekran yoğunluğu (ekran ölçeklendirme)
- Ekran yönlendirme
- Yazı tipi boyutu ve kalınlığı
- Yerel ayar
- Koyu tema ve açık tema
- Klavye kullanılabilirliği
Bu yapılandırma değişikliklerinin çoğu, kullanıcı etkileşiminden kaynaklanır. Örneğin, cihazı döndürmek veya katlamak, uygulamanızın kullanabileceği ekran alanını değiştirir. Harici ekranlara bağlanmak veya bir uygulamayı farklı piksel yoğunluklarına sahip ekranlar arasında taşımak, ekran yoğunluğunu ve görüntü boyutunu değiştirir. Benzer şekilde, ekran ölçeklendirme, yazı tipi boyutu, dil veya tercih edilen tema gibi cihaz ayarlarını değiştirmek, Configuration nesnesindeki ilgili değerleri değiştirir.
Bu parametreler genellikle uygulamanızın kullanıcı arayüzünde yeterince büyük değişiklikler gerektirir.
Bu nedenle Android platformunda, bu parametreler değiştiğinde kullanılmak üzere özel olarak tasarlanmış bir mekanizma bulunur.
Bu mekanizma Activity rekreasyon olarak adlandırılır.
Etkinlik rekreasyonu
Yapılandırma değişikliği olduğunda sistem Activity öğesini yeniden oluşturur. Bunun için sistem, onDestroy yöntemini çağırır ve mevcut Activity örneğini yok eder. Ardından onCreate kullanarak yeni bir örnek oluşturur ve bu yeni Activity örneği yeni, güncellenmiş yapılandırmayla başlatır. Bu, sistemin kullanıcı arayüzünü yeni yapılandırmayla yeniden oluşturduğu anlamına da gelir.
Genellikle Activity, composable'lar için ana makine görevi görür. Activity yeniden oluşturulduğunda Compose, yeni yapılandırma değerlerini kullanarak kullanıcı arayüzünüzü de yeniden oluşturur.
Yeniden oluşturma davranışı, uygulamanızı yeni cihaz yapılandırmasıyla eşleşen alternatif kaynaklarla otomatik olarak yeniden yükleyerek uygulamanızın yeni yapılandırmalara uyum sağlamasına yardımcı olur.
Rekreasyon örneği
Dize kaynağı kullanarak statik başlık gösteren bir composable düşünün:
// In the res/values/strings.xml file // <string name="compose">Jetpack Compose</string> // In your Compose code Text( text = stringResource(R.string.compose) )
Activity oluşturulduğunda Text composable'ı mevcut yapılandırmayı (ör. dil) okur ve uygun dize kaynağını çözer.
Dil değişirse sistem etkinliği yeniden oluşturur. Bu durumda Compose, kullanıcı arayüzünü yeniden oluşturur. stringResource, mevcut yapılandırmadan okunduğu için başlık otomatik olarak doğru yerelleştirilmiş değere güncellenir.
Yeniden oluşturma işlemi, Activity içinde alan olarak tutulan tüm durumları da temizler.
Yapılandırma değişikliklerinde kullanıcı arayüzü durumunuzu korumak için önerilen durum yönetimi kalıplarını kullanın. Veriler ve iş mantığı için ViewModel, kullanıcı arayüzü düzeyindeki durum için rememberSaveable kullanın. Bu mekanizmalar sayesinde, kullanıcı arayüzü yeni yapılandırmayı yansıtacak şekilde güncellenirken durumunuz Activity yeniden oluşturma işleminden etkilenmez.
Durumu Compose'da kaydetme hakkında daha fazla bilgi için Compose'da kullanıcı arayüzü durumunu kaydetme başlıklı makaleyi inceleyin.
Kullanıcı beklentileri
Uygulama kullanıcıları, durumun korunmasını bekler. Kullanıcı bir form doldururken bilgi almak için çoklu pencere modunda başka bir uygulama açarsa temizlenmiş bir forma veya uygulamada tamamen başka bir yere dönmesi kötü bir kullanıcı deneyimi olur. Geliştirici olarak, yapılandırma değişiklikleri ve etkinliğin yeniden oluşturulması yoluyla tutarlı bir kullanıcı deneyimi sunmanız gerekir.
Uygulamanızda durumun korunup korunmadığını doğrulamak için hem uygulama ön plandayken hem de arka plandayken yapılandırma değişikliklerine neden olan işlemler gerçekleştirebilirsiniz. Bu işlemler aşağıdakileri içerir:
- Cihazı döndürme
- Çoklu pencere moduna giriliyor
- Çoklu pencere modunda veya serbest biçimli penceredeyken uygulamayı yeniden boyutlandırma
- Birden fazla ekranı olan katlanabilir bir cihazı katlama
- Sistem ayarlarında görüntü boyutunu veya görüntü ölçeklendirmesini değiştirme
- Uygulamayı farklı ekran yoğunluklarına sahip ekranlar arasında taşıma (ör. bağlı harici monitörler veya katlanabilir cihazların ekranları)
- Sistem temasını değiştirme (ör. koyu tema yerine açık tema)
- Yazı tipi boyutunu değiştirme
- Sistem veya uygulama dilini değiştirme
- Donanım klavyesi bağlama veya bağlantısını kesme
- Takma birimini bağlama veya bağlantısını kesme
Activity yeniden oluşturma işlemi sırasında ilgili durumu korumak için uygulayabileceğiniz birkaç yaklaşım vardır. Hangisini kullanacağınız, korumak istediğiniz durum türüne bağlıdır:
- Karmaşık veya büyük veriler için işlem sonlandırmayı yönetmek üzere yerel kalıcılık.
Kalıcı yerel depolama alanında veritabanları veya
DataStorebulunur. - Kullanıcı uygulamayı etkin bir şekilde kullanırken bellekte kullanıcı arayüzüyle ilgili durumu işlemek için
ViewModelörnekleri gibi tutulan nesneler. - Yapılandırma değişiklikleri ve sistem tarafından başlatılan işlem sonlandırma sırasında geçici kullanıcı arayüzü durumunu korumak için
rememberSaveable. Bu, kullanıcı girişine, kaydırma konumuna veya gezinmeye bağlı olan ancakViewModeliçinde yer almayan durumlar için uygundur.
Bu API'lerin her biri hakkında ayrıntılı bilgi edinmek ve her birinin ne zaman kullanılmasının uygun olduğunu öğrenmek için Kullanıcı arayüzü durumlarını kaydetme başlıklı makaleyi inceleyin.
Etkinliklerin yeniden oluşturulmasını kısıtlama
Belirli yapılandırma değişiklikleri için etkinliğin otomatik olarak yeniden oluşturulmasını engelleyebilirsiniz. Yalnızca Compose kullanılan modern uygulamalarda kullanıcı arayüzünüz her iki durumda da yeniden oluşturulur ancak yapılandırma değişikliğini doğrudan işlemeniz önerilir.
Varsayılan olarak, yapılandırma değişikliği sistemi, kullanıcı arayüzü ve etkinlikten türetilen tüm nesneler dahil olmak üzere etkinliği yok etmeye ve yeniden oluşturmaya zorlar. Etkinliğinizin yapılandırma değişikliğini kendisinin işlediğini beyan ederseniz sistem bunu engeller. Bunun yerine yalnızca Configuration nesnesi güncellenir ve Compose, kullanıcı arayüzünüzü yeni değerlerle yeniden oluşturur.
Yapılandırma değişikliklerini doğrudan Compose'da işlemenin çeşitli avantajları vardır:
- Daha iyi performans: Kullanıcı arayüzünü yeniden oluşturmak, özellikle küçük değişiklikler için tam bir etkinlik yeniden oluşturma döngüsünden daha az maliyetlidir.
- Akıcı animasyonlar: Etkinliğin yeniden başlatılmasını önlemek, yapılandırma değişiklikleri sırasında sürekli animasyonlar çalıştırmanıza olanak tanır. Örneğin, cihaz döndürülürken sorunsuz düzen geçişleri yapılabilir.
- Durum koruma: Activity kitaplığı örneğini korumak, ekran döndürme gibi bir etkinlik sırasında geçici kullanıcı arayüzü durumu kaybı riskini azaltır. Sistem tarafından başlatılan işlem sonlandırma için durum korumayı yine de yönetmeniz gerektiğini unutmayın.
Belirli yapılandırma değişiklikleri için etkinliğin yeniden oluşturulmasını devre dışı bırakmak istiyorsanız yapılandırma türünü AndroidManifest.xml dosyanızdaki <activity> girişinde android:configChanges öğesine ekleyin. Olası değerler, android:configChanges özelliğinin belgelerinde yer alır.
Aşağıdaki manifest kodu, ekran yönü ve klavye kullanılabilirliği değiştiğinde MyActivity için Activity yeniden oluşturma işlemini devre dışı bırakır:
<activity
android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:label="@string/app_name">
Android 17
Android 17'den (API düzeyi 37) itibaren sistem, genellikle kullanıcı arayüzünün tamamen yeniden oluşturulmasını gerektirmeyen çeşitli yapılandırma değişiklikleri için etkinlikleri varsayılan olarak yeniden başlatmaz.
Bunun yerine, etkinlikler etkin kalır ve onConfigurationChanged() geri çağırma işlevi aracılığıyla güncellemeleri alır.
Yapılandırmada yapılan değişiklikler şunlardır:
CONFIG_KEYBOARDCONFIG_KEYBOARD_HIDDENCONFIG_NAVIGATIONCONFIG_TOUCHSCREENCONFIG_COLOR_MODECONFIG_UI_MODE(yalnızca kullanıcı arayüzü moduUI_MODE_TYPE_DESKolarak veyaUI_MODE_TYPE_DESKmodundan başka bir türe değiştiğinde)
Uygulamanız bu değişikliklerle ilgili kaynakları yeniden yüklemek için tam yeniden başlatma işlemine ihtiyaç duyuyorsa artık manifesto dosyasındaki android:recreateOnConfigChanges özelliğini kullanarak eski davranışı açıkça etkinleştirmeniz gerekir.
Bu özellik, hangi yapılandırma değişikliklerinin tam bir etkinlik durdurma, yok etme ve yeniden oluşturma döngüsünü tetiklemesi gerektiğini belirtmenize olanak tanır. Örneğin:
<activity
android:name=".MyActivity"
android:recreateOnConfigChanges="keyboard|keyboardHidden|navigation|colorMode|touchscreen|...">
...
</activity>
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 mümkün olan tüm yapılandırma değişiklikleri için Activity yeniden oluşturmayı devre dışı bıraksanız bile uygulamanızın yapılandırma değişikliklerini doğru şekilde işlemesi gerekir.
Configuration nesnesi, LocalConfiguration yerel oluşturma ile Compose kullanıcı arayüzü hiyerarşisinde kullanılabilir. LocalConfiguration.current değerinden okuma yapan composable işlevler, bu değer her değiştiğinde yeniden oluşturulur. Oluşturma yerellerinin işleyiş şekli hakkında bilgi için CompositionLocal ile yerel kapsamlı veriler başlıklı makaleyi inceleyin.
Örnek
Aşağıdaki örnekte, bir composable belirli bir biçimde tarih gösterir.
Birleştirilebilir öğe, LocalConfiguration.current ile ConfigurationCompat.getLocales yöntemini çağırarak sistem yerel ayar yapılandırması değişikliklerine yanıt verir.
@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 öğesinin yeniden oluşturulmasını önlemek için Compose kodunu barındıran Activity, yerel ayar yapılandırma değişikliklerini devre dışı bırakmalıdır. Bunun için android:configChanges değerini locale|layoutDirection olarak ayarlarsınız.
Yapılandırma değişiklikleri: Temel kavramlar ve en iyi uygulamalar
Yapılandırma değişiklikleri üzerinde çalışırken bilmeniz gereken temel kavramlar şunlardır:
- Yapılandırmalar: Cihaz yapılandırmaları, kullanıcı arayüzünün kullanıcıya nasıl gösterileceğini (ör. uygulama görüntü boyutu, ekran yoğunluğu, yerel ayar veya sistem teması) tanımlar.
Compose'da yapılandırma değerlerine
LocalConfigurationkullanarak erişebilirsiniz. - Yapılandırma değişiklikleri: Yapılandırmalar, kullanıcı etkileşimiyle değişir. Örneğin, kullanıcı cihaz ayarlarını veya cihazla fiziksel etkileşimini değiştirebilir. Yapılandırma değişikliklerini engellemenin bir yolu yoktur.
Activityyeniden oluşturma: Yapılandırma değişiklikleri varsayılan olarakActivityyeniden oluşturulmasına neden olur. Bu, yeni yapılandırma için uygulama durumunu yeniden başlatmaya yönelik yerleşik bir mekanizmadır.Activityimhası:Activityyeniden oluşturma, sistemin eskiActivityörneğini imha etmesine ve yerine yenisini oluşturmasına neden olur. Eski örnek artık kullanılmıyor. Yaşam döngüsü kapsamındaki nesnelere yönelik referansları, amaçlanan kapsamlarının dışında tutmaktan kaçının.- Durum: Eski
Activityörneğindeki durum, yeniActivityörneğinde mevcut değildir. Bunun nedeni, iki farklı nesne örneği olmalarıdır. Durumu etkinliğe bağlamak yerine, Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı gibi uygulamanın ve kullanıcının durumunu korumak için önerilen API'leri kullanın. - Kapsam dışında kalmayı seçmek: Bir yapılandırma değişikliği türü için etkinliğin yeniden oluşturulmasını devre dışı bırakmak, uygulamanızın yeni yapılandırmaya göre düzgün şekilde güncellenmesini gerektirir.
İyi bir kullanıcı deneyimi sunmak için aşağıdaki en iyi uygulamaları izleyin:
- Sık yapılandırma değişikliklerine hazırlıklı olun: API seviyesi, form faktörü veya kullanıcı arayüzü araç setinden bağımsız olarak yapılandırma değişikliklerinin nadir olduğunu veya hiç gerçekleşmediğini varsaymayın. Kullanıcı bir yapılandırma değişikliğine neden olduğunda uygulamaların güncellenmesini ve yeni yapılandırmayla doğru şekilde çalışmaya devam etmesini bekler.
- Durumu koruma:
Activityyeniden oluşturulduğunda kullanıcının durumunu kaybetmeyin.ViewModelverememberSaveablegibi API'leri kullanarak durumu Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı şekilde koruyun. - Kapsam dışı bırakmayı hızlı bir çözüm olarak kullanmayın: Durum kaybını önlemek için
Activityyeniden oluşturma işlemini kapsam dışı bırakmayın. Etkinliğin yeniden oluşturulmasını devre dışı bırakmak için değişikliği işleme sözünü yerine getirmeniz gerekir. AyrıcaActivity, diğer yapılandırma değişikliklerinden kaynaklanan yeniden oluşturma, işlem sonlandırma veya uygulamanın kapatılması nedeniyle durumu kaybedebilirsiniz.Activityyeniden oluşturma işlemini tamamen devre dışı bırakmak mümkün değildir. Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı şekilde durumu koruyun. - Yapılandırma değişikliklerinden kaçınmayın: Yapılandırma değişikliklerinden ve
Activityyeniden oluşturma işleminden kaçınmak için yön, en boy oranı veya yeniden boyutlandırılabilirlik konusunda kısıtlama getirmeyin. Bu durum, uygulamanızı tercih ettikleri şekilde kullanmak isteyen kullanıcıları olumsuz etkiler.
Boyuta dayalı yapılandırma değişikliklerini işleme
Boyuta dayalı yapılandırma değişiklikleri her an gerçekleşebilir ve uygulamanız, kullanıcıların çoklu pencere moduna girebileceği büyük ekranlı bir cihazda çalışırken daha olasıdır. Uygulamanızın bu ortamda iyi çalışmasını beklerler.
Genel olarak iki tür boyut değişikliği vardır: önemli ve önemsiz. Önemli bir boyut değişikliği, genişlik, yükseklik veya en küçük genişlik gibi ekran boyutundaki farklılık nedeniyle yeni yapılandırma için farklı bir alternatif kaynak grubunun geçerli olduğu bir değişikliktir. Bu kaynaklar, uygulamanın kendisinin tanımladığı ve kitaplıklarından herhangi birinde bulunan kaynakları içerir.
Boyuta dayalı yapılandırma değişiklikleri için etkinliğin yeniden oluşturulmasını kısıtlama
Boyuta dayalı yapılandırma değişiklikleri için Activity yeniden oluşturma özelliğini devre dışı bıraktığınızda sistem Activity öğesini yeniden oluşturmaz. Bunun yerine Activity.onConfigurationChanged çağrısı alır. LocalConfiguration.current değerini okuyan tüm composable'lar, yeni boyutu yansıtacak şekilde otomatik olarak yeniden oluşturulur.
Manifest dosyanızda android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" varsa boyuta dayalı yapılandırma değişiklikleri için Activity yeniden oluşturma devre dışı bırakılır.
Ek kaynaklar
Yapılandırma değişikliklerini işleme hakkında daha fazla bilgi için aşağıdaki ek kaynaklara göz atın: