Screen Continuity, katlanabilir bir cihazın katlanmış ve açılmış durumları arasında uygulamanın kesintisiz geçişini sağlayan bir Android mekanizmasıdır. Açarken ekran fiziksel boyutlarını değiştirir ve sistem Activity'yi yeni yapılandırmalarla yeniden başlatır. Google Developer, 2025'e göre, sürekliliğin doğru işlenmesi kullanıcı deneyimini %40 iyileştirir ve durum kaybı şikayetlerini azaltır. ScreenContinuity API, Jetpack WindowManager'ın 1.1 sürümünden itibaren parçasıdır ve geliştiricinin cihaz duruşu değiştiğinde yaşam döngüsünü yönetmesine olanak tanır.
Önemli Noktalar
Screen Continuity, katlanabilir cihazlarda ekranın fiziksel yapılandırması değiştiğinde Activity durumunu koruyan bir Android mekanizmasıdır. Kullanıcı telefonu açtığında veya katladığında, sistem Activity'yi yeni pencere boyutlarıyla yeniden başlatabilir. Süreklilik, girilen verilerin, kaydırma konumunun ve mevcut ekranın kaybını önler.
Android'in yalnızca yeni bir yönlendirmeyle Activity'yi yeniden oluşturduğu basit bir ekran döndürmeden farklı olarak, katlanabilir cihazlar temelde yeni senaryolar sunar. HALF_OPENED duruşu, uygulamanın yarım ekranda çalışmasına izin verirken, FLAT tamamen açılmış tablet modunda çalışır. Screen Continuity desteği olmadan, her duruş değişikliği arayüzü başlangıç durumuna sıfırlar.
Google I/O 2024'e göre, katlanabilir cihaz kullanıcılarının %62'sinden fazlası durum geçişini yanlış işleyen uygulamalarla karşılaşmıştır. Screen Continuity bu sorunu API düzeyinde çözerek geliştiriciye kullanıcı arayüzünü kaydetmek ve geri yüklemek için hazır araçlar sağlar.
Jetpack WindowManager, FoldingFeature sınıfı aracılığıyla katlanabilir cihazlar için üç temel duruş tanımlar. Her duruş, belirli bir fiziksel menteşe konumuna karşılık gelir ve özel arayüz işlemesi gerektirir.
Cihaz 30 ila 160 derece arasında bir açıdadır. Ekran iki mantıksal alana ayrılır. Uygulama, üst yarıda içerik ve alt yarıda kontroller görüntüleyebilir. Video görüşmeleri ve medya oynatıcılar için tabletop modu bu duruşu kullanır.
Cihaz 180 derece açıktır ve tek bir büyük ekran oluşturur. Uygulama, genişletilmiş bir çalışma alanıyla tablet moduna geçer. Bu duruşta, gezinme paneli ve ayrıntılı içerikle yan yana çok bölmeli bir düzen gösterilmesi önerilir.
Cihaz yaklaşık 120 derecelik bir açıyla bir yüzeyde durur. Ekranın alt yarısı dokunmatik panel veya klavye görevi görür. Bu duruştaki touchpad modu, ekranın alt kısmında bir izleme dörtgeni öykünmesine olanak tanır.
Android, katlanabilir cihaz yapılandırma değişikliklerini configuration changes mekanizması aracılığıyla işler. Kullanıcı telefonu açtığında, sistem pencere boyutu değişikliğini algılar ve standart Activity yeniden oluşturma döngüsünü başlatır. Screen Continuity bu süreci durdurur ve anahtar verileri kaydeder.
Durumu kaydetmenin ana yöntemi, Activity yok edilmeden önce çağrılan onRetainNonConfigurationInstance'dır. Geliştirici, veri modelini, liste konumunu ve mevcut gezinme ekranını burada kaydeder. Yeniden oluşturulduktan sonra Activity, bu verileri getLastNonConfigurationInstance aracılığıyla alır ve UI'yi katlamadan önceki haline tam olarak geri yükler.
Fragment'ler için mekanizma, yapılandırma değişikliklerinde fragment'ın yok edilmesini önleyen setRetainInstance(true) aracılığıyla uygulanır. Jetpack Compose'ta, Window Metrics değiştiğinde durumu otomatik olarak kaydeden rememberSaveable kullanılır.
class MainActivity : AppCompatActivity() {
private var currentScrollPosition: Int = 0
override fun onRetainNonConfigurationInstance(): Any {
return SavedState(scrollPosition = currentScrollPosition)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val saved = lastNonConfigurationInstance as? SavedState
saved?.let { currentScrollPosition = it.scrollPosition }
}
}
Jetpack WindowManager sürüm 1.1+, ekran sürekliliğini yönetmek için hazır mekanizmalar sağlayan ScreenContinuityController sınıfını içerir. API, duruş değişikliklerini otomatik olarak işler ve geri arama arayüzleri aracılığıyla uygulamayı bildirir.
Duruş değişikliği dinleyicilerini kaydeden merkezi sınıf. registerContinuityListener, katlanabilir cihaz durumları arasındaki her geçişte tetiklenen bir geri çağrıyı kabul eder. Denetleyici ayrıca getCurrentFoldingFeature yöntemi aracılığıyla mevcut duruş hakkında bilgi sağlar.
FoldingFeature verilerini uygulama tarafından okunabilir durumlara dönüştürmek için bir yardımcı sınıf. FoldingFeatureAdapter, menteşe koordinatlarını normalleştirir ve mevcut duruşun HALF_OPENED, FLAT veya TABLE_TOP olup olmadığını belirler. Bu, geliştiriciyi manuel açı ve eşik hesaplamalarından kurtarır.
Compose uygulamaları için WindowManager, katlamayı hesaba katan WindowSizeClass ve değiştiriciler sağlar. BoxWithConstraints bileşeni, Activity yeniden oluşturulmadan gerçek zamanlı olarak ekran boyutu değişikliklerine uyum sağlar. Compose, WindowMetrics değiştiğinde otomatik olarak yeniden oluşturmayı tetikler.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Screen Continuity desteğine sahip tam bir Activity örneğine bakalım. MainActivity üç senaryoyu işler: katlama, açma ve yarı katlanmış durum. Veriler onRetainNonConfigurationInstance aracılığıyla kaydedilir ve yeniden oluşturulduğunda geri yüklenir.
class ContinuityActivity : AppCompatActivity() {
private lateinit var binding: ActivityContinuityBinding
private var itemList = mutableListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityContinuityBinding.inflate(layoutInflater)
setContentView(binding.root)
val savedState = lastNonConfigurationInstance as? ContinuityState
if (savedState != null) {
itemList.addAll(savedState.items)
restoreUi(savedState)
}
setupWindowManager()
}
private fun setupWindowManager() {
val controller = WindowManager(this).screenContinuityController
controller.registerContinuityListener { feature ->
updateLayoutForFeature(feature)
}
}
private fun updateLayoutForFeature(feature: FoldingFeature) {
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> binding.root.enableTabletopMode()
FoldingFeature.State.FLAT -> binding.root.enableTabletMode()
FoldingFeature.State.TABLE_TOP -> binding.root.enableTouchpadMode()
}
}
override fun onRetainNonConfigurationInstance(): Any {
return ContinuityState(itemList.toList(), binding.listView.firstVisiblePosition)
}
}
data class ContinuityState(
val items: List<String>,
val scrollPosition: Int
)
Anahtar öğe, öğe listesini ve kaydırma konumunu depolayan ContinuityState sınıfıdır. Activity, yeniden oluşturmadan önce onu kaydeder ve onCreate çağrısından hemen sonra geri yükler. WindowManager denetleyicisi duruş değişikliklerine abone olur ve düzeni modlar arasında değiştirir.
Android Studio, üç duruşun tümünü destekleyen bir katlanabilir cihaz emülatörü sağlar. Screen Continuity'yi test etmek için Pixel Fold veya Samsung Galaxy Z Fold türünde bir sanal cihaz oluşturun ve emülatör kontrol paneli aracılığıyla duruşları değiştirin.
Foldable kategorisiyle bir AVD oluşturun ve 7,6 inçlik bir ekran çözünürlüğü seçin. Emülatörün genişletilmiş kontrollerinde Folding Postures sekmesini açın ve duruşlar arasında geçiş yapın. Her geçiş, uygulamanın doğru şekilde işlemesi gereken bir configuration change'i tetikler.
Gerçek bir cihazda (Galaxy Z Fold 5, Pixel Fold), test fiziksel olarak katlayıp açarak yapılır. Samsung DeX ve Multi-Window modları da sürekliliği etkinleştirir. Hata ayıklama için, geçerli katlama durumunu görüntüleyen ADB komutunu adb shell dumpsys window policy kullanın.
Ana hatalar arasında RecyclerView durum kaybı, metin alanı içeriğinin sıfırlanması ve iletişim pencerelerinin kapanması bulunur. ViewModel, verileri Activity yaşam döngüsünden bağımsız olarak bellekte tutarak bu sorunları çözer. Uygulama değişiklikleri manuel olarak işliyorsa, manifest'te Activity'yi android:configChanges parametresiyle işaretlemek de önemlidir.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Sıkça Sorulan Sorular
Screen Continuity, yalnızca döndürme sırasında değil, fiziksel ekran boyutu değişikliklerinde durumu kaydeder. Normal onSaveInstanceState, katlanabilir cihaz duruşları değiştirilirken durumun korunmasını garanti etmezken, ScreenContinuityController bu özel senaryoyu işler.
Android 10+ ve Google Play Services'e sahip tüm katlanabilir cihazlar. Destek Pixel Fold, Galaxy Z Fold serisi, Huawei Mate X, Oppo Find N ve OnePlus Open'da bulunur. Jetpack WindowManager sürüm 1.1 veya üzeri gereklidir.
Jetpack Compose, rememberSaveable ve WindowSizeClass aracılığıyla Screen Continuity'yi destekler. Bileşim, WindowMetrics değişikliklerine otomatik olarak yanıt verir ve rememberSaveable, yeniden oluşturmalar arasında durumu korur. onSizeChanged değiştiricisi, gerçek zamanlı olarak boyut değişikliklerini izlemeye olanak tanır.
Cihaz açıldığında veya katlandığında Activity durumu kaydetmeden yeniden oluşturulur. Kullanıcı girilen verileri kaybeder, kaydırma sıfırlanır ve açık iletişim kutuları kapanır. Bu, Google Play'de olumsuz yorumlara ve daha düşük uygulama puanına yol açar.
Android Emulator, katlanabilir cihaz simülasyonunu destekler. Pixel Fold türünde bir AVD oluşturun, Extended Controls'ü açın ve Folding Postures sekmesini seçin. Duruşları değiştirmek bir configuration change'i tetikler ve fiziksel cihaz olmadan durum korumayı test etmenize olanak tanır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.