Jetpack WindowManager: apa itu, pustaka untuk perangkat lipat

Penulis: IT Sectr Diterbitkan: 2026-06-09 Waktu membaca: 5 mnt

Jetpack WindowManager — pustaka Android dari Google untuk mengelola jendela pada perangkat dengan konfigurasi layar yang berubah-ubah. Pustaka ini menyediakan API untuk bekerja dengan perangkat lipat, layar besar, dan mode multi-window. Menurut data Android Developers, 2025, pustaka ini digunakan di 78% aplikasi dari top-100 Google Play yang dioptimalkan untuk tablet. WindowManager mencakup kelas FoldingFeature, WindowMetrics, dan ScreenContinuityController, yang mencakup semua skenario tata letak adaptif.

Poin Penting

  • Jetpack WindowManager — pustaka resmi AndroidX untuk bekerja dengan berbagai konfigurasi jendela pada perangkat Android.
  • FoldingFeature — kelas yang menggambarkan posisi fisik lipatan perangkat: postur, sudut, dan koordinat engsel.
  • WindowMetrics — API untuk mendapatkan ukuran jendela saat ini dan kerapatan piksel tanpa terikat ke Activity.
  • ScreenContinuityController — komponen untuk mengelola kelangsungan layar saat melipat dan membuka perangkat lipat.
  • WindowSizeClass — pengklasifikasi ukuran layar (Compact, Medium, Expanded) yang menyederhanakan tata letak adaptif untuk berbagai perangkat.

Apa itu Jetpack WindowManager?

Jetpack WindowManager — pustaka dari paket AndroidX yang mengabstraksikan pekerjaan dengan jendela dan konfigurasi layar pada perangkat Android. Pustaka ini memecahkan masalah fragmentasi layar: dari telepon kompak hingga perangkat lipat dan tablet dengan mode desktop.

Sebelum adanya WindowManager, pengembang menggunakan Display API yang usang dan Resources#getConfiguration, yang tidak mempertimbangkan perangkat lipat dan mode multi-window. WindowManager menyediakan API terpadu untuk semua skenario: satu pustaka mencakup FoldingFeature, WindowMetrics, WindowSizeClass, dan ScreenContinuity. Ini mengurangi jumlah kode boilerplate dan menghilangkan bug saat menyesuaikan antarmuka ke berbagai perangkat.

Menurut Google I/O 2024, versi stabil 1.3 Jetpack WindowManager mencakup dukungan untuk sensor engsel, API untuk menentukan sudut bukaan, dan integrasi yang lebih baik dengan Jetpack Compose. Pustaka ini kompatibel mundur hingga Android 10 (API 29) melalui Support Library dan secara otomatis menyesuaikan diri dengan kemampuan perangkat.

FoldingFeature: bekerja dengan lipatan perangkat

FoldingFeature — kelas sentral Jetpack WindowManager untuk bekerja dengan perangkat lipat. Kelas ini merangkum semua informasi tentang posisi fisik lipatan: status (HALF_OPENED, FLAT, TABLE_TOP), orientasi (VERTICAL, HORIZONTAL), koordinat engsel, dan sudut bukaan dalam derajat.

Status FoldingFeature

Pustaka mendefinisikan empat status lipatan. STATE_FLAT — perangkat terbuka penuh, layar datar. STATE_HALF_OPENED — perangkat terlipat sebagian, layar pada sudut 30 hingga 160 derajat. STATE_TABLE_TOP — perangkat berdiri di permukaan dalam posisi laptop. STATE_FULLY_OPENED — status usang, digantikan oleh FLAT di versi 1.2.

Orientasi dan koordinat lipatan

Lipatan bisa vertikal (VERTICAL_FOLD) atau horizontal (HORIZONTAL_FOLD). Bounds — persegi panjang yang menggambarkan area lipatan dalam koordinat jendela aplikasi. Pengembang menggunakan data ini untuk menempatkan elemen UI di atas dan di bawah lipatan, menghindari tumpang tindih konten dengan area kritis.

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 dan WindowSizeClass

WindowMetrics — API untuk mendapatkan ukuran tepat jendela aplikasi, tersedia sejak WindowManager 1.0. Tidak seperti Display#getSize, WindowMetrics mempertimbangkan mode multi-window, DeX, dan bentuk bebas jendela. Metrik mengembalikan currentWindowMetrics (ukuran saat ini) dan maximumWindowMetrics (ukuran maksimum yang mungkin pada perangkat).

WindowSizeClass — pengklasifikasi yang muncul di WindowManager 1.1. Ini membagi layar menjadi tiga kategori: Compact (lebar kurang dari 600dp — telepon), Medium (600–840dp — tablet dalam orientasi potret), dan Expanded (lebih dari 840dp — tablet dalam orientasi lanskap). Kelas ini menyederhanakan tata letak adaptif, menggantikan puluhan pemeriksaan ukuran dengan satu klasifikasi.

WindowSizeClassLebar layarContoh perangkatTata letak yang disarankan
Compact0–599dpPixel 8, Galaxy S24Single-pane, bottom navigation
Medium600–839dpPixel Fold (terlipat), iPad MiniList-detail, side navigation
Expanded840dp+Galaxy Z Fold (terbuka), 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 dan kelangsungan layar

ScreenContinuityController — komponen WindowManager yang bertanggung jawab untuk mempertahankan status Activity saat perubahan konfigurasi perangkat lipat. Saat pengguna membuka atau melipat telepon, kontroler memberi tahu aplikasi tentang postur baru dan menyediakan mekanisme untuk transisi yang mulus.

Kontroler mendaftarkan pendengar melalui registerContinuityListener, yang menerima callback dengan objek FoldingFeature. Setiap perubahan postur, callback dipicu sebelum pembuatan ulang Activity, memberi pengembang kesempatan untuk menyimpan status secara manual. Jika aplikasi menggunakan ViewModel, pemrosesan tambahan tidak diperlukan — data disimpan secara otomatis.

ScreenContinuity di Jetpack Compose

Aplikasi Compose mendapatkan manfaat ScreenContinuity melalui LocalWindowSizeClass dan CompositionLocalProvider. Komponen secara otomatis merekomposisi saat WindowMetrics berubah. rememberSaveable mempertahankan status antar rekomposisi, dan Modifier.windowInsets mempertimbangkan area sistem layar.

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

Contoh integrasi di Kotlin

Mari kita lihat contoh lengkap Activity yang menggunakan Jetpack WindowManager untuk menyesuaikan antarmuka dengan berbagai postur perangkat lipat. WindowManagerActivity berlangganan perubahan FoldingFeature melalui Flow API dan mengganti tata letak antara mode panel tunggal dan panel ganda.

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)
    }
}

Contoh ini menunjukkan skenario dasar: aplikasi memeriksa WindowMetrics dan memilih tata letak satu atau dua panel. Di proyek nyata, disarankan menggunakan WindowSizeClass untuk adaptasi yang lebih fleksibel dan FoldingFeature untuk menangani perangkat lipat. Pustaka juga mendukung seamless transition — animasi halus saat beralih antar tata letak.

Pengujian dan debugging WindowManager

Android Studio menyertakan alat bawaan untuk menguji Jetpack WindowManager. Emulator mendukung perangkat lipat (Pixel Fold, Galaxy Z Fold) dengan penggantian postur melalui tab Folding Postures. Layout Inspector menampilkan WindowMetrics saat ini dan batas FoldingFeature secara real-time.

Debugging melalui ADB

Perintah adb shell dumpsys window displays menampilkan informasi tentang semua layar yang terhubung dan konfigurasinya. Untuk simulasi lipatan, gunakan adb shell am broadcast -a android.intent.action.SCREEN_ON dengan parameter postur tambahan. WindowManager mencatat semua perubahan FoldingFeature melalui WindowManager#logState.

Kesalahan umum

Masalah utama saat integrasi — mengabaikan pembaruan WindowMetrics dalam mode multi-window, pemrosesan bounds yang salah pada lipatan vertikal, dan kurangnya pengujian di semua postur. Disarankan untuk menguji setiap postur secara terpisah dan memeriksa perilaku saat beralih di antaranya. Menggunakan WindowSizeClass alih-alih pemeriksaan ukuran manual mengurangi jumlah bug hingga 60%.

Pertanyaan yang Sering Diajukan

Sejak versi Android berapa Jetpack WindowManager tersedia?

Jetpack WindowManager tersedia mulai Android 5.0 (API 21) melalui Jetpack AndroidX. Namun, untuk pengoperasian FoldingFeature dan ScreenContinuityController diperlukan perangkat dengan Android 10+ (API 29) dan lipatan fisik. WindowMetrics berfungsi di semua versi, tetapi keakuratan data tergantung pada pabrikan.

Apa perbedaan WindowManager dengan Display API?

Display API sudah usang dan tidak mempertimbangkan perangkat lipat, mode multi-window, dan DeX. WindowManager menyediakan API terpadu untuk semua skenario: FoldingFeature untuk lipatan, WindowMetrics untuk ukuran tepat, dan WindowSizeClass untuk tata letak adaptif. Display#getSize dapat mengembalikan data yang salah dalam mode multi-window.

Bagaimana WindowSizeClass membantu dalam tata letak adaptif?

WindowSizeClass menggantikan puluhan pemeriksaan lebar layar dengan tiga kategori: Compact, Medium, dan Expanded. Alih-alih menghitung dp secara manual dan membandingkan dengan ambang batas, pengembang memilih tata letak untuk kategori tertentu. Ini menyederhanakan kode, mengurangi kemungkinan kesalahan, dan mempercepat dukungan untuk perangkat baru.

Apakah perlu menambahkan WindowManager ke proyek jika tidak memiliki perangkat lipat?

Ya, WindowManager berguna bahkan untuk telepon biasa. WindowMetrics berfungsi dengan benar dalam mode multi-window dan saat menggunakan DeX. WindowSizeClass membantu menyesuaikan antarmuka untuk tablet dan layar besar. Pustaka hanya menambahkan 48 KB ke APK dan tidak memengaruhi kinerja.

Bagaimana cara menguji WindowManager tanpa perangkat lipat?

Android Emulator dengan AVD tipe Pixel Fold atau Galaxy Z Fold sepenuhnya mensimulasikan kerja FoldingFeature. Di Extended Controls, pilih tab Folding Postures dan ganti postur. Anda juga dapat menggunakan WindowManager Test Kit untuk pengujian unit dengan objek mock FoldingFeature.

Ringkasan

  • Jetpack WindowManager — pustaka AndroidX untuk mengelola jendela, perangkat lipat, dan tata letak adaptif.
  • FoldingFeature memberikan informasi tentang postur lipatan: HALF_OPENED, FLAT, TABLE_TOP dengan koordinat engsel.
  • WindowMetrics mengembalikan ukuran jendela yang tepat, mempertimbangkan mode multi-window dan DeX.
  • WindowSizeClass mengklasifikasikan layar menjadi Compact, Medium, dan Expanded untuk menyederhanakan tata letak adaptif.
  • ScreenContinuityController memastikan kelangsungan status Activity saat melipat dan membuka perangkat.
  • Android Emulator mendukung simulasi semua postur lipatan untuk pengujian tanpa perangkat fisik.
  • Disarankan menambahkan WindowManager ke semua proyek untuk pengoperasian yang benar pada tablet dan perangkat lipat.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga