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 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 — 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.
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.
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.
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 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.
| WindowSizeClass | Lebar layar | Contoh perangkat | Tata letak yang disarankan |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Single-pane, bottom navigation |
| Medium | 600–839dp | Pixel Fold (terlipat), iPad Mini | List-detail, side navigation |
| Expanded | 840dp+ | Galaxy Z Fold (terbuka), 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 — 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.
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.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Baca juga