Uygulama çalışırken bazı cihaz yapılandırmaları değişebilir. Aşağıdakilerle sınırlı olmamakla birlikte bu önlemlerden bazıları şunlardır:
- Uygulama görüntüleme boyutu
- Ekran yönlendirme
- Yazı tipi boyutu ve ağırlığı
- Yerel ayar
- Koyu mod ve açık mod
- 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. Benzer şekilde, 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, Android platformunun değiştiğinde kullanacağı amaca yönelik bir mekanizma oluşturmak için yeterince büyük değişiklikler yapılmasını gerektirir.
Bu mekanizma Activity yeniden oluşturma işlemidir.
Etkinlikleri yeniden oluşturma
Sistem, yapılandırma değişikliği olduğunda Activity öğesini yeniden oluşturur. Bunu yapmak için sistem onDestroy işlevini ç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 ve güncellenmiş yapılandırmayla başlatılı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ına uygun 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 bir başlık görüntüleyen bir composable'ı ele alalım:
// 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, Oluşturma özelliği kullanıcı arayüzünü yeniden oluşturur. stringResource, mevcut yapılandırmadan okuduğu için başlık otomatik olarak doğru yerelleştirilmiş değerle 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şturulmaya devam eder.
Compose'da durumu kaydetme hakkında daha fazla bilgi için Compose'da kullanıcı arayüzü durumunu kaydetme başlıklı makaleyi inceleyin.
Kullanıcı beklentileri
Bir uygulamanın kullanıcısı, durumun korunmasını bekler. Bir kullanıcı form doldururken bilgi almak için çoklu pencere modunda başka bir uygulama açarsa temizlenmiş bir forma veya uygulamanın tamamen başka bir yerine dönmesi kötü bir kullanıcı deneyimidir. Geliştirici olarak, yapılandırma değişiklikleri ve etkinlik yeniden oluşturma yoluyla tutarlı bir kullanıcı deneyimi sağlamanı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 girme
- Çoklu pencere modunda veya serbest biçimli penceredeyken uygulamayı yeniden boyutlandırma
- Birden fazla ekranı olan katlanabilir bir cihazı katlama
- Sistem temasını değiştirme (ör. koyu mod ve açık mod)
- Yazı tipi boyutunu değiştirme
- Sistem veya uygulama dilini değiştirme
- Donanım klavyesini bağlama veya bağlantısını kaldırma
- Bağlantı istasyonu bağlama veya bağlantısını kaldırma
ActivityYeniden oluşturmaActivity yoluyla ilgili durumu korumak için kullanabileceğiniz çeşitli yaklaşımlar vardır. Hangisinin kullanılacağı, korumak istediğiniz durum türüne bağlıdır:
- Karmaşık veya büyük verilerde işlem sonlandırmayı yönetmek için yerel kalıcılık.
Kalıcı yerel depolama alanı, veritabanlarını veya
DataStore'ı içerir. - Kullanıcı uygulamayı etkin olarak kullanırken bellekte kullanıcı arayüzüyle ilgili durumu işlemek için
ViewModelörnekleri gibi saklanan nesneler. rememberSaveable, 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 kullanılır. Bu, kullanıcı girişine, kaydırma konumuna veya gezinmeye bağlı olan ancakViewModeliçinde yer almayan durumlar için uygundur.
Bunların her birine yönelik API'ler ve her birinin ne zaman kullanılması gerektiği hakkında ayrıntılı bilgi için Kullanıcı arayüzü durumlarını kaydetme başlıklı makaleyi inceleyin.
Etkinlik yeniden oluşturmayı kısıtlama
Belirli yapılandırma değişiklikleri için otomatik etkinlik yeniden oluşturmayı engelleyebilirsiniz. Yalnızca Compose kullanılan modern uygulamalarda kullanıcı arayüzünüz her iki şekilde de 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 sistemin, kullanıcı arayüzü ve Etkinlik'ten türetilen tüm nesneler dahil olmak üzere Etkinliği yok etmesini ve yeniden oluşturmasını 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ı önleyerek yapılandırma değişiklikleri sırasında sürekli animasyonlar (ör. cihaz döndürülürken düzgün düzen geçişleri) çalıştırabilirsiniz.
- Durumu koruma: Etkinlik ö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ırması için durum korumayı yine de yönetmeniz gerektiğini unutmayın.
Belirli yapılandırma değişiklikleri için etkinlik yeniden oluşturmayı devre dışı bırakmak istiyorsanız AndroidManifest.xml dosyanızdaki <activity> girişinde yapılandırma türünü android:configChanges'ya ekleyin. Olası değerler, android:configChanges özelliğiyle ilgili dokümanlarda yer alır.
Aşağıdaki manifest kodu, ekran yönü ve klavye kullanılabilirliği değiştiğinde Activity için MyActivity yeniden oluşturmayı devre dışı bırakır:
<activity
android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:label="@string/app_name">
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ırakırsanız uygulamanız yine de yapılandırma değişikliklerini doğru şekilde işlemelidir.
Configuration nesnesi, LocalConfiguration kompozisyon yereliyle birlikte Compose kullanıcı arayüzü hiyerarşisinde kullanılabilir. Değiştiğinde, LocalConfiguration.current öğesinden okuma yapan composable işlevler yeniden oluşturulur. CompositionLocal'lerin işleyiş şekli hakkında bilgi edinmek için CompositionLocal ile yerel kapsamlı veriler başlıklı makaleyi inceleyin.
Örnek
Aşağıdaki örnekte, belirli bir biçimde tarih gösteren bir composable yer almaktadır.
Composable, LocalConfiguration.current ile ConfigurationCompat.getLocales işlevini çağırarak sistem yerel ayarı yapılandırma değişikliklerine tepki 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 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 ayarını locale|layoutDirection olarak belirleyin.
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ıya yönelik kullanıcı arayüzünün nasıl görüntüleneceğini (ör. uygulama görüntüleme boyutu, yerel ayar veya sistem teması) tanımlar. Oluşturma bölümünde,
LocalConfigurationkullanarak yapılandırma değerlerine 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 olarak etkileşim kurma şeklini değiştirebilir. Yapılandırma değişikliklerini önlemenin bir yolu yoktur.
Activityyeniden oluşturma: Yapılandırma değişiklikleri, varsayılan olarakActivityyeniden oluşturmayla sonuçlanır. Bu, yeni yapılandırma için uygulama durumunu yeniden başlatmaya yönelik yerleşik bir mekanizmadır.Activityyok etme:Activityyeniden oluşturma, sistemin eskiActivityörneğini yok etmesine ve yerine yeni bir örnek oluşturmasına neden olur. Eski örnek artık kullanılmıyor. Yaşam döngüsü kapsamlı nesnelere yönelik referansları, amaçlanan kapsamlarının ötesinde tutmaktan kaçının.- Durum: Eski
Activityörneğindeki durum, iki farklı nesne örneği oldukları için yeniActivityörneğinde mevcut değildir. Durumu Etkinliğe bağlamak yerine, Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı gibi, uygulama ve kullanıcının durumunu korumak için önerilen API'leri kullanın. - Devre dışı bırakma: Bir yapılandırma değişikliği türü için etkinlik yeniden oluşturmayı devre dışı bırakmak istiyorsanız uygulamanızın yeni yapılandırmaya tepki olarak düzgün şekilde güncellenmesi gerekir. Çoğu Compose uygulaması için bu önerilmez.
İyi bir kullanıcı deneyimi sunmak için aşağıdaki en iyi uygulamalara uyun:
- Sık yapılandırma değişikliklerine hazırlıklı olun: API düzeyinden, form faktöründen veya kullanıcı arayüzü araç setinden bağımsız olarak yapılandırma değişikliklerinin nadir olduğunu ya da hiç gerçekleşmediğini varsaymayın. Kullanıcılar 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şturma işlemi gerçekleştiğinde kullanıcının durumunu kaybetmeyin.ViewModelverememberSaveablegibi API'leri kullanarak Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı şekilde durumu koruyun. - Hızlı çözüm olarak devre dışı bırakmaktan kaçının: Durum kaybını önlemek için
Activityyeniden oluşturmayı devre dışı bırakmayın. Etkinlik yeniden oluşturma özelliğini devre dışı bırakmak için değişikliği işleme sözünüzü tutmanız gerekir. Diğer yapılandırma değişikliklerinden, işlemin sonlandırılmasından veya uygulamanın kapatılmasından kaynaklananActivityyeniden oluşturma nedeniyle durumu yine de kaybedebilirsiniz.Activityyeniden oluşturma özelliğini tamamen devre dışı bırakmak mümkün değildir. Durumu Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı şekilde koruyun. - Yapılandırma değişikliklerinden kaçınmayın: Yapılandırma değişikliklerinden ve
Activityyeniden oluşturulmasından kaçınmak için yönlendirme, en-boy oranı veya yeniden boyutlandırılabilme konusunda kısıtlamalar uygulamayın. 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 herhangi bir zamanda gerçekleşebilir ve kullanıcıların çoklu pencere moduna girebileceği büyük ekranlı bir cihazda uygulamanız çalışırken daha olasıdır. Uygulamanızın bu ortamda iyi çalışmasını beklerler.
Boyut değişiklikleri genel olarak iki türde olur: önemli ve önemsiz. Önemli boyut değişikliği, ekran boyutundaki (ör. genişlik, yükseklik veya en küçük genişlik) farklılık nedeniyle yeni yapılandırmada farklı bir alternatif kaynak grubunun geçerli olduğu değişikliktir. Bu kaynaklar arasında uygulamanın kendisinin tanımladığı kaynaklar ve kitaplıklarındaki kaynaklar yer alır.
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şturmayı devre dışı bıraktığınızda sistem Activity yeniden oluşturmaz. Bunun yerine, Activity.onConfigurationChanged numarasına yapılan bir arama alır. LocalConfiguration.current okuyan tüm composable'lar, yeni boyutu yansıtacak şekilde otomatik olarak yeniden oluşturulur.
Manifest dosyanızda android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" olduğunda, boyuta dayalı yapılandırma değişiklikleri için Activity yeniden oluşturma özelliği 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 bakın: