Jetpack WindowManager: ano ito, aklatan para sa mga natitiklop na aparato

May-akda: IT Sectr Nai-publish: 2026-06-09 Oras ng pagbabasa: 5 min

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 — ang opisyal na aklatan ng AndroidX para sa pagtatrabaho sa iba't ibang configuration ng bintana sa mga aparatong Android.
  • FoldingFeature — isang klase na naglalarawan ng pisikal na posisyon ng tupi ng aparato: postura, anggulo at mga coordinate ng bisagra.
  • WindowMetrics — API para sa pagkuha ng kasalukuyang sukat ng bintana at densidad ng pixel nang walang pagkakabit sa Activity.
  • ScreenContinuityController — isang bahagi para sa pamamahala ng pagpapatuloy ng screen kapag tinutupi at binubuksan ang natitiklop na aparato.
  • WindowSizeClass — isang tagapag-uri ng laki ng screen (Compact, Medium, Expanded) na nagpapasimple ng adaptive na layout para sa iba't ibang aparato.

Ano ang Jetpack WindowManager?

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: pagtatrabaho sa tupi 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.

Mga estado ng FoldingFeature

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.

Oryentasyon at mga coordinate ng tupi

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.

kotlin
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 at WindowSizeClass

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.

WindowSizeClassLapad ng screenHalimbawang aparatoInirerekomendang layout
Compact0–599dpPixel 8, Galaxy S24Single-pane, bottom navigation
Medium600–839dpPixel Fold (nakatiklop), iPad MiniList-detail, side navigation
Expanded840dp+Galaxy Z Fold (nakabukas), iPad ProMulti-pane, navigation rail
kotlin
class MyComposable {
    @Composable
    fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
        when (windowSizeClass.widthSizeClass) {
            WindowWidthSizeClass.Compact -> CompactScreen()
            WindowWidthSizeClass.Expanded -> ExpandedScreen()
            else -> MediumScreen()
        }
    }
}

ScreenContinuityController at pagpapatuloy ng screen

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.

ScreenContinuity sa Jetpack Compose

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.

kotlin
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
    if (feature.state == FoldingFeature.State.FLAT) {
        logContinuityEvent("Device unfolded")
    }
}

Mga halimbawa ng integrasyon sa Kotlin

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.

kotlin
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.

Pagsubok at pag-debug ng WindowManager

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.

Pag-debug sa pamamagitan ng ADB

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.

Mga karaniwang pagkakamali

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

Mula sa anong bersyon ng Android available ang Jetpack WindowManager?

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.

Paano naiiba ang WindowManager sa Display API?

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.

Paano nakakatulong ang WindowSizeClass sa adaptive na layout?

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.

Kailangan bang magdagdag ng WindowManager sa proyekto kung walang natitiklop na 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.

Paano subukan ang WindowManager nang walang natitiklop na aparato?

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

  • Jetpack WindowManager — aklatan ng AndroidX para sa pamamahala ng mga bintana, natitiklop na aparato at adaptive na layout.
  • FoldingFeature ay nagbibigay ng impormasyon tungkol sa postura ng pagtitiklop: HALF_OPENED, FLAT, TABLE_TOP na may mga coordinate ng bisagra.
  • WindowMetrics ay nagbabalik ng eksaktong sukat ng bintana, isinasaalang-alang ang multi-window at DeX mode.
  • WindowSizeClass ay nag-uuri ng mga screen sa Compact, Medium at Expanded para pasimplehin ang adaptive na layout.
  • ScreenContinuityController ay tinitiyak ang pagpapanatili ng estado ng Activity kapag tinutupi at binubuksan ang aparato.
  • Android Emulator ay sumusuporta sa simulation ng lahat ng postura ng pagtitiklop para sa pagsubok nang walang pisikal na aparato.
  • Inirerekomenda ang pagdaragdag ng WindowManager sa lahat ng proyekto para sa tamang pagpapatakbo sa mga tablet at natitiklop na aparato.

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.

Pag-usapan ang proyekto

Basahin din