Screen Continuity — az Android mechanizmusa, amely biztosítja az alkalmazás zökkenőmentes átmenetét a hajlítható eszköz összehajtott és kihajtott állapota között. Kihajtáskor a képernyő fizikai méretei megváltoznak, és a rendszer újraindítja az Activity-t új konfigurációkkal. A Google Developer, 2025 szerint a folytonosság helyes kezelése 40%-kal javítja a felhasználói élményt és csökkenti az állapot visszaállításával kapcsolatos panaszok számát. A ScreenContinuity API a Jetpack WindowManager része az 1.1-es verziótól kezdve, és lehetővé teszi a fejlesztő számára az életciklus kezelését az eszköz pózának változásakor.
Főbb pontok
Screen Continuity egy Android mechanizmus, amely megőrzi az Activity állapotát a képernyő fizikai konfigurációjának megváltozásakor hajlítható eszközökön. Amikor a felhasználó kihajtja vagy összehajtja a telefont, a rendszer újraindíthatja az Activity-t új ablakméretekkel. A folytonosság megakadályozza a bevitt adatok, a görgetési pozíció és az aktuális képernyő elvesztését.
Ellentétben a szokásos képernyőelforgatással, ahol az Android egyszerűen újra létrehozza az Activity-t egy új tájolással, a hajlítható eszközök teljesen új forgatókönyveket vezetnek be. A HALF_OPENED póz lehetővé teszi az alkalmazás számára, hogy fél képernyőn működjön, a FLAT pedig teljesen kihajtott táblagép módban. A Screen Continuity támogatása nélkül minden pózváltás visszaállítja a felületet a kezdeti állapotba.
A Google I/O 2024 szerint a hajlítható eszközök felhasználóinak több mint 62%-a találkozott olyan alkalmazásokkal, amelyek nem megfelelően kezelik az állapotok közötti váltást. A Screen Continuity API szinten oldja meg ezt a problémát, kész eszközöket biztosítva a fejlesztőnek a UI mentéséhez és visszaállításához.
Jetpack WindowManager három alapvető pózt határoz meg a hajlítható eszközhöz a FoldingFeature osztályon keresztül. Minden póz megfelel a csuklópánt egy bizonyos fizikai helyzetének, és különleges felületkezelést igényel.
Az eszköz 30-160 fokos szögben van. A képernyő két logikai területre oszlik. Az alkalmazás megjelenítheti a tartalmat a felső felén és a vezérlőelemeket az alsó felén. Tabletop mód videohívásokhoz és médialejátszókhoz pontosan ezt a pózt használja.
Az eszköz 180 fokban van kinyitva, egyetlen nagy képernyőt alkotva. Az alkalmazás táblagép módba vált megnövelt munkaterülettel. Ebben a pózban ajánlott több paneles elrendezést megjeleníteni navigációs sávval és részletes tartalommal egymás mellett.
Az eszköz egy felületen áll körülbelül 120 fokos szögben. A képernyő alsó fele érintőpanelként vagy billentyűzetként szolgál. Touchpad mód ebben a pózban lehetővé teszi a trackpad emulálását a képernyő alsó részén.
Android a hajlítható eszköz konfigurációváltozását a configuration changes mechanizmuson keresztül kezeli. Amikor a felhasználó kihajtja a telefont, a rendszer rögzíti az ablakméret változását és elindítja az Activity újralétrehozásának szokásos ciklusát. A Screen Continuity elfogja ezt a folyamatot és elmenti a kulcsfontosságú adatokat.
Az állapot mentésének fő módszere az onRetainNonConfigurationInstance, amelyet az Activity megsemmisítése előtt hívnak meg. A fejlesztő ebben menti el az adatmodellt, a lista pozícióját és az aktuális navigációs képernyőt. Az újralétrehozás után az Activity ezeket az adatokat a getLastNonConfigurationInstance segítségével kapja meg, és pontosan az összehajtás pillanatáig állítja vissza a UI-t.
A Fragments esetében a mechanizmus a setRetainInstance(true) segítségével van implementálva, amely megakadályozza a fragment megsemmisítését konfigurációváltozáskor. A Jetpack Compose-ban a rememberSaveable-t használják, amely automatikusan elmenti az állapotot a Window Metrics változásakor.
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 1.1+ verziója tartalmazza a ScreenContinuityController osztályt, amely kész mechanizmusokat biztosít a képernyő folytonosságának kezelésére. Az API automatikusan kezeli a pózváltást és callback interfészeken keresztül értesíti az alkalmazást.
A központi osztály, amely regisztrálja a pózváltozás figyelőit. A registerContinuityListener egy callback-et fogad, amely minden egyes átmenetnél aktiválódik a hajlítható eszköz állapotai között. A vezérlő információt is nyújt az aktuális pózról a getCurrentFoldingFeature metóduson keresztül.
Segédosztály a FoldingFeature adatok alkalmazás számára érthető állapotokká alakításához. A FoldingFeatureAdapter normalizálja a csuklópánt koordinátáit és meghatározza, hogy az aktuális póz HALF_OPENED, FLAT vagy TABLE_TOP. Ez megkíméli a fejlesztőt a szögek és küszöbértékek manuális kiszámításától.
A Compose alkalmazások számára a WindowManager WindowSizeClass-t és olyan módosítókat biztosít, amelyek figyelembe veszik a hajlítást. A BoxWithConstraints komponens valós időben alkalmazkodik a képernyő méretének változásaihoz anélkül, hogy újra létrehozná az Activity-t. A Compose automatikusan recompozíciót vált ki a WindowMetrics változásakor.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Tekintsünk át egy teljes példát Activity-re Screen Continuity támogatással. A MainActivity három forgatókönyvet kezel: összehajtás, kihajtás és félig nyitott állapot. Az adatok az onRetainNonConfigurationInstance segítségével kerülnek mentésre és az újralétrehozáskor visszaállításra.
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
)
A kulcselem a ContinuityState osztály, amely az elemek listáját és a görgetési pozíciót tárolja. Az Activity ezt az újralétrehozás előtt elmenti és közvetlenül az onCreate meghívása után visszaállítja. A WindowManager vezérlő feliratkozik a pózváltozásokra és átkapcsolja az elrendezést a módok között.
Android Studio hajlítható eszköz emulátort biztosít mindhárom póz támogatásával. A Screen Continuity teszteléséhez elegendő egy Pixel Fold vagy Samsung Galaxy Z Fold típusú virtuális eszközt létrehozni és a pózt az emulátor vezérlőpultján keresztül váltani.
Hozzon létre egy AVD-t Foldable kategóriával és válasszon 7,6 hüvelykes képernyőfelbontást. Az emulátor kibővített vezérlőiben nyissa meg a Folding Postures fület és váltson a pózok között. Minden váltás egy configuration change-t vált ki, amelyet az alkalmazásnak helyesen kell kezelnie.
Valódi eszközön (Galaxy Z Fold 5, Pixel Fold) a tesztelés fizikai kihajtással történik. A Samsung DeX és Multi-Window módok szintén aktiválják a folytonosságot. Hibakereséshez használja az adb shell dumpsys window policy ADB parancsot, amely megjeleníti a hajtás aktuális állapotát.
A fő hibák — a RecyclerView állapotának elvesztése, a szöveg visszaállítása szövegmezőkben és a párbeszédablakok bezáródása. A ViewModel ezeket a problémákat úgy oldja meg, hogy az adatokat a memóriában tárolja függetlenül az Activity életciklusától. Szintén fontos az Activity megjelölése a manifestben az android:configChanges paraméterrel, ha az alkalmazás manuálisan kezeli a változásokat.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Gyakran Ismételt Kérdések
Screen Continuity a képernyő fizikai méretének változásakor menti az állapotot, nem csak elforgatáskor. A szokásos onSaveInstanceState nem garantálja a megőrzést a hajlítható eszköz pózainak váltásakor, míg a ScreenContinuityController pontosan ezt a forgatókönyvet kezeli.
Minden hajlítható eszköz Android 10+ és Google Play szolgáltatásokkal. A támogatás megtalálható a Pixel Fold-ban, a Galaxy Z Fold sorozatban, a Huawei Mate X-ben, az Oppo Find N-ben és a OnePlus Open-ben. A működéshez Jetpack WindowManager 1.1-es vagy újabb verzió szükséges.
Jetpack Compose a Screen Continuity-t a rememberSaveable és WindowSizeClass segítségével támogatja. A kompozíció automatikusan reagál a WindowMetrics változására, a rememberSaveable pedig elmenti az állapotot a recompozíciók között. Az onSizeChanged módosító lehetővé teszi a méretváltozások valós idejű követését.
Az eszköz kihajtásakor vagy összehajtásakor az Activity újra létrejön az állapot megőrzése nélkül. A felhasználó elveszíti a bevitt adatokat, a görgetés visszaáll, a nyitott párbeszédablakok bezáródnak. Ez negatív értékelésekhez és az alkalmazás Google Play-beli értékelésének csökkenéséhez vezet.
Android Emulator támogatja a hajlítható eszközök szimulációját. Hozzon létre egy Pixel Fold típusú AVD-t, nyissa meg az Extended Controls-t és válassza a Folding Postures fület. A pózok váltása configuration change-t vált ki, lehetővé téve az állapotmentés tesztelését fizikai eszköz nélkül.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is