Jetpack WindowManager Google द्वारा एक Android लाइब्रेरी है जो बदलने योग्य स्क्रीन कॉन्फ़िगरेशन वाले उपकरणों पर विंडो प्रबंधित करने के लिए है। यह फोल्डेबल डिवाइस, बड़ी स्क्रीन और मल्टी-विंडो मोड के साथ काम करने के लिए API प्रदान करती है। Android Developers, 2025 के अनुसार, टैबलेट के लिए अनुकूलित Google Play के टॉप-100 में से 78% ऐप्स में लाइब्रेरी का उपयोग किया जाता है। WindowManager में FoldingFeature, WindowMetrics और ScreenContinuityController क्लास शामिल हैं, जो सभी अनुकूली लेआउट परिदृश्यों को कवर करते हैं।
मुख्य बिंदु
Jetpack WindowManager AndroidX सूट की एक लाइब्रेरी है जो Android उपकरणों पर विंडो और स्क्रीन कॉन्फ़िगरेशन के साथ काम को अमूर्त करती है। यह स्क्रीन विखंडन की समस्या को हल करती है: कॉम्पैक्ट फोन से लेकर फोल्डेबल डिवाइस और डेस्कटॉप मोड वाले टैबलेट तक।
WindowManager से पहले, डेवलपर पुराने Display API और Resources#getConfiguration का उपयोग करते थे, जो फोल्डेबल डिवाइस और मल्टी-विंडो मोड को ध्यान में नहीं रखते थे। WindowManager सभी परिदृश्यों के लिए एक एकीकृत API प्रदान करता है: एक लाइब्रेरी FoldingFeature, WindowMetrics, WindowSizeClass और ScreenContinuity को कवर करती है। यह बॉयलरप्लेट कोड को कम करता है और विभिन्न उपकरणों के लिए इंटरफ़ेस को अनुकूलित करते समय बग को समाप्त करता है।
Google I/O 2024 के अनुसार, Jetpack WindowManager स्थिर संस्करण 1.3 में हिंज सेंसर के लिए समर्थन, खुलने के कोण को निर्धारित करने के लिए API और Jetpack Compose के साथ बेहतर एकीकरण शामिल है। लाइब्रेरी Support Library के माध्यम से Android 10 (API 29) तक पिछड़ी संगत है और डिवाइस क्षमताओं के अनुसार स्वचालित रूप से अनुकूलित होती है।
FoldingFeature फोल्डेबल डिवाइस के साथ काम करने के लिए Jetpack WindowManager का केंद्रीय क्लास है। यह फोल्ड की भौतिक स्थिति के बारे में सभी जानकारी समाहित करता है: स्थिति (HALF_OPENED, FLAT, TABLE_TOP), अभिविन्यास (VERTICAL, HORIZONTAL), हिंज निर्देशांक और डिग्री में खुलने का कोण।
लाइब्रेरी चार फोल्ड स्थितियाँ परिभाषित करती है। STATE_FLAT — डिवाइस पूरी तरह से खुला है, स्क्रीन सपाट है। STATE_HALF_OPENED — डिवाइस आंशिक रूप से मुड़ा हुआ है, स्क्रीन 30 से 160 डिग्री के कोण पर है। STATE_TABLE_TOP — डिवाइस लैपटॉप मुद्रा में सतह पर खड़ा है। STATE_FULLY_OPENED — एक पुरानी स्थिति, संस्करण 1.2 में FLAT द्वारा प्रतिस्थापित की गई।
फोल्ड वर्टिकल (VERTICAL_FOLD) या हॉरिज़ॉन्टल (HORIZONTAL_FOLD) हो सकता है। Bounds एक आयत है जो एप्लिकेशन विंडो निर्देशांक में फोल्ड क्षेत्र का वर्णन करता है। डेवलपर इस डेटा का उपयोग UI तत्वों को फोल्ड के ऊपर और नीचे रखने के लिए करता है, क्रिटिकल क्षेत्र के साथ सामग्री ओवरलैप से बचने के लिए।
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 है जो WindowManager 1.0 से उपलब्ध एप्लिकेशन विंडो के सटीक आयाम प्राप्त करने के लिए है। Display#getSize के विपरीत, WindowMetrics मल्टी-विंडो मोड, DeX और फ्री-फॉर्म विंडो को ध्यान में रखता है। मेट्रिक्स currentWindowMetrics (वर्तमान आकार) और maximumWindowMetrics (डिवाइस पर अधिकतम संभव आकार) लौटाता है।
WindowSizeClass एक वर्गीकरणकर्ता है जो WindowManager 1.1 में दिखाई दिया। यह स्क्रीन को तीन श्रेणियों में विभाजित करता है: Compact (चौड़ाई 600dp से कम — फोन), Medium (600–840dp — पोर्ट्रेट ओरिएंटेशन में टैबलेट) और Expanded (840dp से अधिक — लैंडस्केप में टैबलेट)। यह क्लास आकार की दर्जनों जाँचों को एकल वर्गीकरण से बदलकर अनुकूली लेआउट को सरल बनाता है।
| WindowSizeClass | स्क्रीन चौड़ाई | उदाहरण डिवाइस | अनुशंसित लेआउट |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | एकल-पैनल, निचला नेविगेशन |
| Medium | 600–839dp | Pixel Fold (मुड़ा हुआ), iPad Mini | सूची-विवरण, साइड नेविगेशन |
| Expanded | 840dp+ | Galaxy Z Fold (खुला), iPad Pro | मल्टी-पैनल, नेविगेशन रेल |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController WindowManager का एक घटक है जो फोल्डेबल डिवाइस कॉन्फ़िगरेशन बदलने पर Activity स्थिति को संरक्षित करने के लिए जिम्मेदार है। जब उपयोगकर्ता फोन को खोलता या मोड़ता है, तो नियंत्रक नई मुद्रा के बारे में एप्लिकेशन को सूचित करता है और सहज संक्रमण के लिए तंत्र प्रदान करता है।
नियंत्रक registerContinuityListener के माध्यम से श्रोताओं को पंजीकृत करता है, जो FoldingFeature ऑब्जेक्ट के साथ एक कॉलबैक स्वीकार करता है। प्रत्येक मुद्रा परिवर्तन पर, कॉलबैक Activity पुनर्निर्माण से पहले फायर होता है, जिससे डेवलपर को मैन्युअल रूप से स्थिति सहेजने का अवसर मिलता है। यदि एप्लिकेशन ViewModel का उपयोग करता है, तो अतिरिक्त हैंडलिंग की आवश्यकता नहीं है — डेटा स्वचालित रूप से सहेजा जाता है।
Compose एप्लिकेशन LocalWindowSizeClass और CompositionLocalProvider के माध्यम से ScreenContinuity का लाभ उठाते हैं। WindowMetrics बदलने पर घटक स्वचालित रूप से रीकंपोज़ होते हैं। rememberSaveable रीकंपोज़िशन के बीच स्थिति को संरक्षित करता है, और Modifier.windowInsets सिस्टम स्क्रीन क्षेत्रों को ध्यान में रखता है।
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
आइए एक Activity का पूर्ण उदाहरण देखें जो विभिन्न फोल्डेबल मुद्राओं के लिए इंटरफ़ेस को अनुकूलित करने के लिए Jetpack WindowManager का उपयोग करता है। WindowManagerActivity Flow API के माध्यम से FoldingFeature परिवर्तनों की सदस्यता लेता है और एकल-पैनल और दोहरे-पैनल लेआउट के बीच स्विच करता है।
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)
}
}
उदाहरण एक बुनियादी परिदृश्य प्रदर्शित करता है: एप्लिकेशन WindowMetrics की जाँच करता है और एकल-पैनल या दोहरा-पैनल लेआउट चुनता है। वास्तविक परियोजनाओं में, अधिक लचीले अनुकूलन के लिए WindowSizeClass और फोल्डेबल डिवाइस को संभालने के लिए FoldingFeature का उपयोग करने की अनुशंसा की जाती है। लाइब्रेरी seamless transition का भी समर्थन करती है — लेआउट के बीच स्विच करते समय सहज एनिमेशन।
Android Studio में Jetpack WindowManager के परीक्षण के लिए अंतर्निहित उपकरण शामिल हैं। एमुलेटर फोल्डेबल डिवाइस (Pixel Fold, Galaxy Z Fold) को Folding Postures टैब के माध्यम से मुद्रा स्विचिंग के साथ समर्थन करता है। Layout Inspector वास्तविक समय में वर्तमान WindowMetrics और FoldingFeature सीमाएँ दिखाता है।
कमांड adb shell dumpsys window displays सभी कनेक्टेड डिस्प्ले और उनके कॉन्फ़िगरेशन के बारे में जानकारी आउटपुट करता है। फोल्ड को सिम्युलेट करने के लिए, अतिरिक्त मुद्रा पैरामीटर के साथ adb shell am broadcast -a android.intent.action.SCREEN_ON का उपयोग करें। WindowManager WindowManager#logState के माध्यम से सभी FoldingFeature परिवर्तनों को लॉग करता है।
मुख्य एकीकरण समस्याएँ — मल्टी-विंडो मोड में WindowMetrics अपडेट को अनदेखा करना, वर्टिकल फोल्ड के साथ bounds की गलत हैंडलिंग और सभी मुद्राओं पर परीक्षण की कमी। अनुशंसा की जाती है कि प्रत्येक मुद्रा का अलग-अलग परीक्षण करें और उनके बीच स्विच करते समय व्यवहार की जाँच करें। मैन्युअल आकार जाँच के बजाय WindowSizeClass का उपयोग करने से बग 60% कम हो जाते हैं।
अक्सर पूछे जाने वाले प्रश्न
Jetpack WindowManager Android 5.0 (API 21) से Jetpack AndroidX के माध्यम से उपलब्ध है। हालांकि, FoldingFeature और ScreenContinuityController के काम करने के लिए Android 10+ (API 29) और भौतिक फोल्ड वाले डिवाइस की आवश्यकता होती है। WindowMetrics सभी संस्करणों पर काम करता है, लेकिन डेटा सटीकता निर्माता पर निर्भर करती है।
Display API पुराना है और फोल्डेबल डिवाइस, मल्टी-विंडो और DeX मोड को ध्यान में नहीं रखता है। WindowManager सभी परिदृश्यों के लिए एक एकीकृत API प्रदान करता है: फोल्ड के लिए FoldingFeature, सटीक आयामों के लिए WindowMetrics और अनुकूली लेआउट के लिए WindowSizeClass। Display#getSize मल्टी-विंडो में गलत डेटा लौटा सकता है।
WindowSizeClass स्क्रीन चौड़ाई की दर्जनों जाँचों को तीन श्रेणियों से बदल देता है: Compact, Medium और Expanded। मैन्युअल रूप से dp की गणना करने और थ्रेशोल्ड से तुलना करने के बजाय, डेवलपर एक विशिष्ट श्रेणी के लिए लेआउट चुनता है। यह कोड को सरल बनाता है, त्रुटियों की संभावना को कम करता है और नए उपकरणों के समर्थन को गति देता है।
हाँ, WindowManager सामान्य फोन के लिए भी उपयोगी है। WindowMetrics मल्टी-विंडो मोड और DeX का उपयोग करते समय सही ढंग से काम करता है। WindowSizeClass टैबलेट और बड़ी स्क्रीन के लिए इंटरफ़ेस को अनुकूलित करने में मदद करता है। लाइब्रेरी APK में केवल 48 KB जोड़ती है और प्रदर्शन को प्रभावित नहीं करती है।
Pixel Fold या Galaxy Z Fold जैसे AVD वाला Android Emulator FoldingFeature संचालन को पूरी तरह से सिम्युलेट करता है। Extended Controls में, Folding Postures टैब चुनें और मुद्राएँ बदलें। आप FoldingFeature मॉक ऑब्जेक्ट के साथ यूनिट परीक्षण के लिए WindowManager Test Kit का भी उपयोग कर सकते हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें