Jetpack WindowManager — isang aklatan ng Android mula sa Google para sa pamamahala ng mga bintana sa mga aparatong may nagbabagong configuration ng screen. Nagbibigay ito ng API para sa pagtatrabaho sa mga natitiklop na aparato, malalaking screen at multi-window mode. Ayon sa datos ng Android Developers, 2025, ang aklatan ay ginagamit sa 78% ng mga aplikasyon mula sa top-100 Google Play na na-optimize para sa mga tablet. Ang WindowManager ay may kasamang mga klase na FoldingFeature, WindowMetrics at ScreenContinuityController, na sumasaklaw sa lahat ng senaryo ng adaptive na layout.
Mga Pangunahing Punto
Jetpack WindowManager — isang aklatan mula sa AndroidX package na nag-aabstrak ng pagtatrabaho sa mga bintana at configuration ng screen sa mga aparatong Android. Nilulutas nito ang problema ng fragmentation ng screen: mula sa mga compact na telepono hanggang sa mga natitiklop na aparato at tablet na may desktop mode.
Bago dumating ang WindowManager, ang mga developer ay gumagamit ng luma nang Display API at Resources#getConfiguration, na hindi isinasaalang-alang ang mga natitiklop na aparato at multi-window mode. Ang WindowManager ay nagbibigay ng pinag-isang API para sa lahat ng senaryo: isang aklatan ang sumasaklaw sa FoldingFeature, WindowMetrics, WindowSizeClass at ScreenContinuity. Binabawasan nito ang dami ng boilerplate code at inaalis ang mga bug sa pag-aangkop ng interface sa iba't ibang aparato.
Ayon sa Google I/O 2024, ang stable na bersyon 1.3 ng Jetpack WindowManager ay may kasamang suporta para sa mga sensor ng bisagra, API para sa pagtukoy ng anggulo ng pagbubukas at pinabuting integrasyon sa Jetpack Compose. Ang aklatan ay backward compatible hanggang Android 10 (API 29) sa pamamagitan ng Support Library at awtomatikong umaangkop sa mga kakayahan ng aparato.
FoldingFeature — ang sentral na klase ng Jetpack WindowManager para sa pagtatrabaho sa mga natitiklop na aparato. Sinasaklaw nito ang lahat ng impormasyon tungkol sa pisikal na posisyon ng tupi: estado (HALF_OPENED, FLAT, TABLE_TOP), oryentasyon (VERTICAL, HORIZONTAL), mga coordinate ng bisagra at anggulo ng pagbubukas sa degrees.
Ang aklatan ay tumutukoy ng apat na estado ng pagtitiklop. STATE_FLAT — ang aparato ay ganap na nakabukas, ang screen ay patag. STATE_HALF_OPENED — ang aparato ay bahagyang nakatiklop, ang screen ay nasa anggulong 30 hanggang 160 degrees. STATE_TABLE_TOP — ang aparato ay nakatayo sa ibabaw sa posisyong laptop. STATE_FULLY_OPENED — isang lumang estado, pinalitan ng FLAT sa bersyon 1.2.
Ang tupi ay maaaring patayo (VERTICAL_FOLD) o pahalang (HORIZONTAL_FOLD). Bounds — isang parihaba na naglalarawan ng lugar ng tupi sa mga coordinate ng bintana ng aplikasyon. Ginagamit ng developer ang datos na ito para maglagay ng mga elemento ng UI sa itaas at ibaba ng tupi, iniiwasan ang pag-overlap ng nilalaman sa kritikal na lugar.
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()
flow.collect { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
}
}
WindowMetrics — API para sa pagkuha ng eksaktong sukat ng bintana ng aplikasyon, available simula WindowManager 1.0. Hindi tulad ng Display#getSize, isinasaalang-alang ng WindowMetrics ang multi-window mode, DeX at malayang anyo ng bintana. Ang metrics ay nagbabalik ng currentWindowMetrics (kasalukuyang sukat) at maximumWindowMetrics (maximum na posibleng sukat sa aparato).
WindowSizeClass — isang tagapag-uri na lumitaw sa WindowManager 1.1. Hinahati nito ang mga screen sa tatlong kategorya: Compact (lapad na mas mababa sa 600dp — telepono), Medium (600–840dp — tablet sa portrait na oryentasyon) at Expanded (higit sa 840dp — tablet sa landscape na oryentasyon). Pinapasimple ng klaseng ito ang adaptive na layout, pinapalitan ang dose-dosenang pagsusuri ng sukat ng isang klasipikasyon.
| WindowSizeClass | Lapad ng screen | Halimbawang aparato | Inirerekomendang layout |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Single-pane, bottom navigation |
| Medium | 600–839dp | Pixel Fold (nakatiklop), iPad Mini | List-detail, side navigation |
| Expanded | 840dp+ | Galaxy Z Fold (nakabukas), iPad Pro | Multi-pane, navigation rail |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController — isang bahagi ng WindowManager na responsable para sa pagpapanatili ng estado ng Activity kapag nagbago ang configuration ng natitiklop na aparato. Kapag binuksan o tinupi ng gumagamit ang telepono, inaabisuhan ng controller ang aplikasyon tungkol sa bagong postura at nagbibigay ng mga mekanismo para sa maayos na transisyon.
Nagrerehistro ang controller ng mga tagapakinig sa pamamagitan ng registerContinuityListener, na tumatanggap ng callback na may FoldingFeature object. Sa bawat pagbabago ng postura, ang callback ay nag-trigger bago muling likhain ang Activity, na nagbibigay sa developer ng pagkakataon na manu-manong i-save ang estado. Kung ang aplikasyon ay gumagamit ng ViewModel, hindi kinakailangan ang karagdagang pagproseso — awtomatikong nai-save ang datos.
Ang mga aplikasyon ng Compose ay nakikinabang mula sa ScreenContinuity sa pamamagitan ng LocalWindowSizeClass at CompositionLocalProvider. Ang mga bahagi ay awtomatikong nagre-recompose kapag nagbago ang WindowMetrics. rememberSaveable ay nagpapanatili ng estado sa pagitan ng mga recomposisyon, at Modifier.windowInsets ay isinasaalang-alang ang mga systemic na lugar ng screen.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Tingnan natin ang isang kumpletong halimbawa ng Activity na gumagamit ng Jetpack WindowManager para iakma ang interface sa iba't ibang postura ng natitiklop na aparato. WindowManagerActivity ay naka-subscribe sa mga pagbabago ng FoldingFeature sa pamamagitan ng Flow API at pinalilipat ang layout sa pagitan ng single at dual panel mode.
class WindowManagerActivity : AppCompatActivity() {
private lateinit var binding: ActivityWindowBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWindowBinding.inflate(layoutInflater)
setContentView(binding.root)
val windowManager = WindowManager(this)
val metrics = windowManager.currentWindowMetrics
if (metrics.bounds.width() > dpToPx(600)) {
showDualPaneLayout()
} else {
showSinglePaneLayout()
}
}
private fun showDualPaneLayout() {
binding.content.layoutManager = GridLayoutManager(this, 2)
}
private fun showSinglePaneLayout() {
binding.content.layoutManager = LinearLayoutManager(this)
}
}
Ang halimbawa ay nagpapakita ng pangunahing senaryo: sinusuri ng aplikasyon ang WindowMetrics at pumipili ng layout na may isa o dalawang panel. Sa mga totoong proyekto, inirerekomenda ang paggamit ng WindowSizeClass para sa mas nababanat na adaptasyon at FoldingFeature para sa paghawak ng mga natitiklop na aparato. Sinusuportahan din ng aklatan ang seamless transition — maayos na animasyon kapag lumilipat sa pagitan ng mga layout.
Android Studio ay may kasamang mga built-in na tool para sa pagsubok ng Jetpack WindowManager. Ang emulator ay sumusuporta sa mga natitiklop na aparato (Pixel Fold, Galaxy Z Fold) na may paglipat ng postura sa pamamagitan ng tab na Folding Postures. Layout Inspector ay nagpapakita ng kasalukuyang WindowMetrics at mga hangganan ng FoldingFeature sa real-time.
Ang utos na adb shell dumpsys window displays ay nagpapakita ng impormasyon tungkol sa lahat ng konektadong display at kanilang configuration. Para sa simulation ng pagtitiklop, gamitin ang adb shell am broadcast -a android.intent.action.SCREEN_ON na may karagdagang parameter ng postura. Ang WindowManager ay nagla-log ng lahat ng pagbabago sa FoldingFeature sa pamamagitan ng WindowManager#logState.
Ang pangunahing problema sa integrasyon — pagpapabaya sa mga update ng WindowMetrics sa multi-window mode, maling pagproseso ng bounds sa patayong pagtitiklop at kakulangan ng pagsubok sa lahat ng postura. Inirerekomenda na subukan ang bawat postura nang hiwalay at suriin ang pag-uugali kapag lumilipat sa pagitan ng mga ito. Ang paggamit ng WindowSizeClass sa halip ng manu-manong pagsusuri ng sukat ay nagbabawas ng bilang ng mga bug ng 60%.
Mga Madalas Itanong
Ang Jetpack WindowManager ay available simula Android 5.0 (API 21) sa pamamagitan ng Jetpack AndroidX. Gayunpaman, para sa pagpapatakbo ng FoldingFeature at ScreenContinuityController ay kinakailangan ang aparato na may Android 10+ (API 29) at pisikal na pagtitiklop. Ang WindowMetrics ay gumagana sa lahat ng bersyon, ngunit ang katumpakan ng datos ay depende sa tagagawa.
Ang Display API ay luma na at hindi isinasaalang-alang ang mga natitiklop na aparato, multi-window at DeX mode. WindowManager ay nagbibigay ng pinag-isang API para sa lahat ng senaryo: FoldingFeature para sa pagtitiklop, WindowMetrics para sa eksaktong sukat at WindowSizeClass para sa adaptive na layout. Ang Display#getSize ay maaaring magbalik ng maling datos sa multi-window.
WindowSizeClass ay pinapalitan ang dose-dosenang pagsusuri ng lapad ng screen ng tatlong kategorya: Compact, Medium at Expanded. Sa halip ng manu-manong pagkalkula ng dp at paghahambing sa mga threshold, pumipili ang developer ng layout para sa isang partikular na kategorya. Pinapasimple nito ang code, binabawasan ang posibilidad ng mga pagkakamali at pinapabilis ang suporta para sa mga bagong aparato.
Oo, ang WindowManager ay kapaki-pakinabang kahit para sa mga ordinaryong telepono. WindowMetrics ay gumagana nang tama sa multi-window mode at kapag gumagamit ng DeX. WindowSizeClass ay tumutulong na iakma ang interface para sa mga tablet at malalaking screen. Ang aklatan ay nagdaragdag lamang ng 48 KB sa APK at hindi nakakaapekto sa pagganap.
Android Emulator na may AVD na uri ng Pixel Fold o Galaxy Z Fold ay ganap na ginagaya ang pagpapatakbo ng FoldingFeature. Sa Extended Controls, piliin ang tab na Folding Postures at palipatin ang mga postura. Maaari ring gamitin ang WindowManager Test Kit para sa unit testing na may mock na object ng FoldingFeature.
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