Screen Continuity — mekanismo ng Android na nagsisiguro ng walang patid na paglipat ng application sa pagitan ng nakatiklop at nakabukas na estado ng isang natitiklop na device. Sa pagbubukas, binabago ng screen ang pisikal na sukat nito at ni-restart ng system ang Activity gamit ang mga bagong configuration. Ayon sa Google Developer, 2025, ang tamang paghawak ng continuity ay nagpapabuti ng karanasan ng user ng 40% at nagbabawas ng bilang ng mga reklamo tungkol sa pag-reset ng estado. Ang ScreenContinuity API ay bahagi ng Jetpack WindowManager simula sa bersyon 1.1 at pinapayagan ang developer na pamahalaan ang lifecycle kapag nagbabago ang pose ng device.
Mga Pangunahing Punto
Screen Continuity ay isang mekanismo ng Android na nagpapanatili ng estado ng Activity kapag nagbabago ang pisikal na configuration ng screen sa mga natitiklop na device. Kapag binuksan o tiniklop ng user ang telepono, maaaring i-restart ng system ang Activity na may mga bagong sukat ng window. Pinipigilan ng continuity ang pagkawala ng inilagay na data, posisyon ng scroll, at kasalukuyang screen.
Hindi tulad ng karaniwang pag-ikot ng screen, kung saan muling ginagawa ng Android ang Activity na may bagong oryentasyon, ang mga natitiklop na device ay nagpapakilala ng mga panibagong senaryo. Ang pose na HALF_OPENED ay nagpapahintulot sa application na gumana sa kalahating screen, at FLAT — sa ganap na nakabukas na tablet mode. Kung walang suporta sa Screen Continuity, ang bawat pagbabago ng pose ay ni-reset ang interface sa paunang estado.
Ayon sa Google I/O 2024, mahigit 62% ng mga user ng natitiklop na device ay nakatagpo ng mga application na hindi wastong humahawak ng paglipat sa pagitan ng mga estado. Niresolba ng Screen Continuity ang problemang ito sa antas ng API, na nagbibigay sa developer ng mga handa na tool para sa pag-save at pag-restore ng UI.
Jetpack WindowManager ay tumutukoy ng tatlong pangunahing pose ng natitiklop na device sa pamamagitan ng klase na FoldingFeature. Ang bawat pose ay tumutugma sa isang tiyak na pisikal na posisyon ng bisagra at nangangailangan ng espesyal na paghawak ng interface.
Ang device ay nasa anggulong 30 hanggang 160 degrees. Ang screen ay nahahati sa dalawang lohikal na lugar. Maaaring magpakita ang application ng nilalaman sa itaas na kalahati at mga kontrol sa ibabang kalahati. Tabletop mode para sa mga video call at media player ay gumagamit ng pose na ito.
Ang device ay nakabukas ng 180 degrees, na bumubuo ng isang malaking screen. Ang application ay lumipat sa tablet mode na may pinalaking workspace. Sa pose na ito, inirerekomenda na magpakita ng multi-pane layout na may navigation bar at detalyadong nilalaman na magkatabi.
Ang device ay nakatayo sa isang surface sa anggulong mga 120 degrees. Ang ibabang kalahati ng screen ay nagsisilbing touch panel o keyboard. Touchpad mode sa pose na ito ay nagpapahintulot sa pag-emulate ng trackpad sa ibabang bahagi ng screen.
Android ay humahawak ng pagbabago ng configuration ng natitiklop na device sa pamamagitan ng mekanismo ng configuration changes. Kapag binuksan ng user ang telepono, nirerekord ng system ang pagbabago ng laki ng window at sinisimulan ang karaniwang cycle ng muling paggawa ng Activity. Inaagaw ng Screen Continuity ang prosesong ito at sine-save ang mahahalagang data.
Ang pangunahing pamamaraan para sa pag-save ng estado ay onRetainNonConfigurationInstance, na tinatawag bago sirain ang Activity. Sine-save ng developer dito ang modelo ng data, posisyon ng listahan at kasalukuyang screen ng nabigasyon. Pagkatapos ng muling paggawa, natatanggap ng Activity ang data na ito sa pamamagitan ng getLastNonConfigurationInstance at ni-restore ang UI nang eksakto hanggang sa sandali ng pagtiklop.
Para sa Fragments, ang mekanismo ay ipinatupad sa pamamagitan ng setRetainInstance(true), na pumipigil sa pagkasira ng fragment kapag nagbago ang configuration. Sa Jetpack Compose, ginagamit ang rememberSaveable, na awtomatikong nagse-save ng estado kapag nagbago ang Window Metrics.
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 bersyon 1.1+ ay may kasamang klase na ScreenContinuityController, na nagbibigay ng mga handa na mekanismo para sa pamamahala ng continuity ng screen. Awtomatikong hinahawakan ng API ang pagbabago ng pose at nag-aabiso sa application sa pamamagitan ng mga callback interface.
Ang pangunahing klase na nagrerehistro ng mga tagapakinig ng pagbabago ng pose. registerContinuityListener ay tumatanggap ng callback na na-trigger sa bawat paglipat sa pagitan ng mga estado ng natitiklop na device. Ang controller ay nagbibigay din ng impormasyon tungkol sa kasalukuyang pose sa pamamagitan ng pamamaraang getCurrentFoldingFeature.
Utility class para sa pag-convert ng data ng FoldingFeature sa mga estado na naiintindihan ng application. FoldingFeatureAdapter ay nag-normalize ng mga coordinate ng bisagra at tinutukoy kung ang kasalukuyang pose ay HALF_OPENED, FLAT o TABLE_TOP. Pinapalaya nito ang developer mula sa manu-manong pagkalkula ng mga anggulo at halaga ng threshold.
Para sa mga application ng Compose, ang WindowManager ay nagbibigay ng WindowSizeClass at mga modifier na isinasaalang-alang ang pagtiklop. Ang component na BoxWithConstraints ay umaangkop sa mga pagbabago ng laki ng screen sa real-time nang hindi muling ginagawa ang Activity. Awtomatikong na-trigger ng Compose ang recomposition kapag nagbago ang WindowMetrics.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Tingnan natin ang kumpletong halimbawa ng Activity na may suporta sa Screen Continuity. MainActivity ay humahawak ng tatlong senaryo: pagtiklop, pagbukas at kalahating bukas na estado. Ang data ay sine-save sa pamamagitan ng onRetainNonConfigurationInstance at nire-restore kapag muling ginawa.
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
)
Ang pangunahing elemento ay ang klase na ContinuityState, na nag-iimbak ng listahan ng mga elemento at posisyon ng scroll. Sine-save ito ng Activity bago ang muling paggawa at nire-restore kaagad pagkatapos tawagin ang onCreate. Ang WindowManager controller ay nag-subscribe sa mga pagbabago ng pose at nagpapalipat-lipat ng layout sa pagitan ng mga mode.
Android Studio ay nagbibigay ng emulator ng natitiklop na device na may suporta para sa lahat ng tatlong pose. Para sa pagsubok ng Screen Continuity, sapat na gumawa ng virtual device na may uri na Pixel Fold o Samsung Galaxy Z Fold at magpalit ng pose sa pamamagitan ng control panel ng emulator.
Gumawa ng AVD na may kategoryang Foldable at pumili ng resolution ng 7.6-pulgadang screen. Sa extended controls ng emulator, buksan ang tab na Folding Postures at lumipat sa pagitan ng mga pose. Ang bawat paglipat ay nagti-trigger ng configuration change na dapat na wastong hawakan ng application.
Sa totoong device (Galaxy Z Fold 5, Pixel Fold) ang pagsubok ay ginagawa sa pamamagitan ng pisikal na pagbukas. Ang mga mode na Samsung DeX at Multi-Window ay nag-a-activate din ng continuity. Para sa debugging, gamitin ang ADB command na adb shell dumpsys window policy, na nagpapakita ng kasalukuyang estado ng pagtiklop.
Ang mga pangunahing error — pagkawala ng estado ng RecyclerView, pag-reset ng text sa mga text field at pagsasara ng mga dialog window. ViewModel ay niresolba ang mga problemang ito sa pamamagitan ng pag-iimbak ng data sa memorya nang hiwalay sa lifecycle ng Activity. Mahalaga rin na i-annotate ang Activity sa manifest gamit ang parameter na android:configChanges kung manu-manong hinahawakan ng application ang mga pagbabago.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Mga Madalas Itanong
Screen Continuity ay nagse-save ng estado kapag pisikal na nagbago ang laki ng screen, hindi lamang sa pag-ikot. Ang karaniwang onSaveInstanceState ay hindi ginagarantiyahan ang pagpapanatili kapag lumipat ng pose ng natitiklop na device, samantalang ang ScreenContinuityController ay humahawak mismo ng senaryong ito.
Lahat ng natitiklop na device na may Android 10+ at mga serbisyo ng Google Play. Ang suporta ay kasama sa Pixel Fold, serye ng Galaxy Z Fold, Huawei Mate X, Oppo Find N at OnePlus Open. Para sa paggana, kinakailangan ang Jetpack WindowManager bersyon 1.1 at mas mataas.
Jetpack Compose ay sumusuporta sa Screen Continuity sa pamamagitan ng rememberSaveable at WindowSizeClass. Ang komposisyon ay awtomatikong tumutugon sa pagbabago ng WindowMetrics at ang rememberSaveable ay nagse-save ng estado sa pagitan ng mga recomposition. Ang modifier na onSizeChanged ay nagpapahintulot sa pagsubaybay ng mga pagbabago ng laki sa real-time.
Sa pagbukas o pagtiklop ng device, ang Activity ay muling ginagawa nang hindi nagse-save ng estado. Nawawalan ng inilagay na data ang user, nire-reset ang scroll, nagsasara ang mga bukas na dialog. Ito ay humahantong sa mga negatibong review at pagbaba ng rating ng application sa Google Play.
Android Emulator ay sumusuporta sa simulation ng mga natitiklop na device. Gumawa ng AVD na may uri na Pixel Fold, buksan ang Extended Controls at piliin ang tab na Folding Postures. Ang paglipat ng pose ay nagti-trigger ng configuration change, na nagpapahintulot sa pagsubok ng pag-save ng estado nang walang pisikal na device.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din