ऐप्लिकेशन विजेट, ऐप्लिकेशन के छोटे व्यू होते हैं. इन्हें होम स्क्रीन जैसे अन्य ऐप्लिकेशन में एम्बेड किया जा सकता है. साथ ही, समय-समय पर अपडेट पाए जा सकते हैं. इन व्यू को यूज़र इंटरफ़ेस में विजेट कहा जाता है. इन्हें ऐप्लिकेशन विजेट प्रोवाइडर (या विजेट प्रोवाइडर) की मदद से पब्लिश किया जा सकता है. ऐप्लिकेशन का ऐसा कॉम्पोनेंट जिसमें अन्य विजेट मौजूद होते हैं उसे ऐप्लिकेशन विजेट होस्ट (या विजेट होस्ट) कहा जाता है. पहली इमेज में, संगीत विजेट का एक सैंपल दिखाया गया है:
इस दस्तावेज़ में, विजेट उपलब्ध कराने वाली सेवा का इस्तेमाल करके विजेट पब्लिश करने का तरीका बताया गया है. ऐप्लिकेशन विजेट होस्ट करने के लिए, अपना AppWidgetHost बनाने के बारे में ज़्यादा जानने के लिए, विजेट होस्ट बनाएं लेख पढ़ें.
विजेट डिज़ाइन करने के बारे में जानकारी पाने के लिए, ऐप्लिकेशन विजेट की खास जानकारी देखें.
Android स्किल
GitHub पर देखेंAppWidget के अपडेट और बिट मैप की मेमोरी मैनेज करना
android skills add glance-appwidget-updates-and-memoryविजेट के कॉम्पोनेंट
विजेट बनाने के लिए, आपको इन बुनियादी कॉम्पोनेंट की ज़रूरत होगी:
AppWidgetProviderInfoऑब्जेक्ट- यह किसी विजेट के मेटाडेटा के बारे में बताता है. जैसे, विजेट का लेआउट, अपडेट का अंतराल, और
AppWidgetProviderक्लास.AppWidgetProviderInfoको एक्सएमएल में तय किया गया है, जैसा कि इस दस्तावेज़ में बताया गया है. AppWidgetProviderक्लास- यह उन बुनियादी तरीकों के बारे में बताता है जिनकी मदद से, प्रोग्राम के हिसाब से विजेट के साथ इंटरफ़ेस किया जा सकता है. इसकी मदद से, आपको विजेट के अपडेट होने, चालू होने, बंद होने या मिटाए जाने पर ब्रॉडकास्ट मिलते हैं.
AppWidgetProviderको मेनिफ़ेस्ट में डिक्लेयर करें और फिर उसे लागू करें. इसके बारे में इस दस्तावेज़ में बताया गया है. - लेआउट देखें
- विजेट के लिए शुरुआती लेआउट तय करता है. लेआउट को एक्सएमएल में तय किया जाता है, जैसा कि इस दस्तावेज़ में बताया गया है.
दूसरी इमेज में दिखाया गया है कि ये कॉम्पोनेंट, ऐप्लिकेशन विजेट की प्रोसेसिंग के पूरे फ़्लो में कैसे फ़िट होते हैं.
अगर आपके विजेट को उपयोगकर्ता के कॉन्फ़िगरेशन की ज़रूरत है, तो ऐप्लिकेशन विजेट कॉन्फ़िगरेशन की गतिविधि लागू करें. इस गतिविधि की मदद से, उपयोगकर्ता विजेट की सेटिंग में बदलाव कर सकते हैं. उदाहरण के लिए, घड़ी वाले विजेट के लिए टाइम ज़ोन.
- Android 12 (एपीआई लेवल 31) से, डिफ़ॉल्ट कॉन्फ़िगरेशन उपलब्ध कराया जा सकता है. साथ ही, उपयोगकर्ताओं को बाद में विजेट को फिर से कॉन्फ़िगर करने की अनुमति दी जा सकती है. ज़्यादा जानकारी के लिए, विजेट के डिफ़ॉल्ट कॉन्फ़िगरेशन का इस्तेमाल करना और उपयोगकर्ताओं को प्लेस किए गए विजेट फिर से कॉन्फ़िगर करने की अनुमति देना लेख पढ़ें.
- Android 11 (एपीआई लेवल 30) या इससे पहले के वर्शन में, यह गतिविधि हर बार लॉन्च होती है जब उपयोगकर्ता अपनी होम स्क्रीन पर विजेट जोड़ता है.
हम इन सुधारों का सुझाव भी देते हैं: फ़्लेक्सिबल विजेट लेआउट, अन्य सुधार, बेहतर विजेट, कलेक्शन विजेट, और विजेट होस्ट बनाना.
AppWidgetProviderInfo एक्सएमएल का एलान करना
मेटाडेटा की सेटिंग तय करने का तरीका, Glance पर आधारित विजेट और पारंपरिक व्यू, दोनों के लिए एक जैसा होता है. जैसे, डिफ़ॉल्ट सेल साइज़, साइज़ बदलने से जुड़ी पाबंदियां, और अपडेट का अंतराल.
मेटाडेटा की एक्सएमएल फ़ाइल को तय और कॉन्फ़िगर करने का तरीका जानने के लिए, Glance के दस्तावेज़ में Compose-first AppWidgetProviderInfo एक्सएमएल सेक्शन का एलान करें देखें.
विजेट ब्रॉडकास्ट को मैनेज करने के लिए, AppWidgetProvider क्लास का इस्तेमाल करना
प्लैटफ़ॉर्म के ब्रॉडकास्ट रिसीवर मैकेनिक्स, मेनिफ़ेस्ट डिक्लेरेशन फ़िल्टर, और लाइफ़साइकल इवेंट लूप को प्लैटफ़ॉर्म के तहत यूनिफ़ाइड किया गया है. कंपोज़-फ़र्स्ट डेवलपमेंट में, इन ब्रॉडकास्ट को GlanceAppWidgetReceiver रैपर का इस्तेमाल करके व्यवस्थित किया जाता है.
मेनिफ़ेस्ट में रिसीवर को रजिस्टर करने और Hilt के साथ काम करने वाले लाइफ़साइकल ओवरराइड को लागू करने का तरीका जानने के लिए, Glance के दस्तावेज़ में Compose-first ब्रॉडकास्ट सेक्शन को मैनेज करने के लिए AppWidgetProvider क्लास का इस्तेमाल करें देखें.
विजेट का लेआउट बनाना
आपको एक्सएमएल में अपने विजेट के लिए शुरुआती लेआउट तय करना होगा. साथ ही, उसे प्रोजेक्ट की res/layout/ डायरेक्ट्री में सेव करना होगा. ज़्यादा जानकारी के लिए, डिज़ाइन से जुड़े दिशा-निर्देश देखें.
अगर आपको लेआउट के बारे में जानकारी है, तो विजेट का लेआउट बनाना आसान है. हालांकि, ध्यान रखें कि विजेट के लेआउट RemoteViews पर आधारित होते हैं. यह हर तरह के लेआउट या व्यू विजेट के साथ काम नहीं करता.
RemoteViews के साथ काम करने वाले व्यू की सबक्लास या कस्टम व्यू का इस्तेमाल नहीं किया जा सकता.
RemoteViews में ViewStub भी काम करता है. यह एक ऐसा View है जो दिखता नहीं है और जिसका साइज़ शून्य होता है. इसका इस्तेमाल, रनटाइम के दौरान लेआउट रिसॉर्स को लेज़ी इन्फ़्लेट करने के लिए किया जा सकता है.
स्टेटफ़ुल व्यवहार के लिए सहायता
Android 12 में, इन मौजूदा कॉम्पोनेंट का इस्तेमाल करके, स्टेटफ़ुल व्यवहार के लिए सहायता जोड़ी गई है:
विजेट अब भी स्टेटलेस है. आपके ऐप्लिकेशन को स्थिति को सेव करना होगा और स्थिति में बदलाव होने पर होने वाले इवेंट के लिए रजिस्टर करना होगा.
यहां दिए गए कोड के उदाहरण में, इन कॉम्पोनेंट को लागू करने का तरीका बताया गया है.
// Check the view. remoteView.setCompoundButtonChecked(R.id.my_checkbox, true) // Check a radio group. remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2) // Listen for check changes. The intent has an extra with the key // EXTRA_CHECKED that specifies the current checked state of the view. remoteView.setOnCheckedChangeResponse( R.id.my_checkbox, RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent) )
दो लेआउट उपलब्ध कराएं: एक res/layout-v31 में Android 12 या इसके बाद के वर्शन वाले डिवाइसों को टारगेट करने के लिए और दूसरा डिफ़ॉल्ट res/layout फ़ोल्डर में Android 11 या इससे पहले के वर्शन वाले डिवाइसों को टारगेट करने के लिए.
गोल बॉर्डर लागू करना
बाहरी बैकग्राउंड और अंदरूनी अनुपात वाली त्रिज्याओं का हिसाब लगाना स्टैंडर्ड और शेयर किया गया है. Compose-first डेवलपमेंट में, इसे Kotlin में डाइनैमिक तौर पर सेट किया जा सकता है. इसके साथ-साथ, कस्टम थीम के रिसॉर्स भी सेट किए जा सकते हैं.
पुराने Android डिवाइसों के लिए, कोने की गोलाई लागू करने या डाइनैमिक स्टाइल सेट अप करने के लिए, Glance के दस्तावेज़ में Compose-first कोने की गोलाई लागू करें सेक्शन देखें.
RemoteViews की इमेज को सिस्टम मेमोरी की सीमाओं के अंदर रखें
विजेट, होम स्क्रीन लॉन्चर प्रोसेस के अंदर चलते हैं. साथ ही, system_server
हर विजेट के लिए बिटमैप मेमोरी की सीमा (6 * width * height बाइट) लागू होती है. इस बारे में ज़्यादा जानने के लिए,
Android 17 में विजेट की मेमोरी की सीमा में हुए बदलाव देखें. RemoteViews की मदद से क्लासिक AppWidgetProvider विजेट बनाते समय, ये काम करें:
WindowMetricsका इस्तेमाल करके बिट मैप को डाउनसैंपल करें: एपीआई लेवल 30 और इसके बाद के वर्शन पर,resources.displayMetricsके बजायWindowManager.currentWindowMetrics.boundsसे अपने बिट मैप का ज़्यादा से ज़्यादा बजट कैलकुलेट करें. साथ ही,Bitmap.Config.RGB_565और दो की घातinSampleSizeका इस्तेमाल करके, अपारदर्शी इमेज को डिकोड करें.- इमेज बदलते समय, फ़ुल
updateAppWidgetकॉल का इस्तेमाल करें:ImageViewबिटमैप याIconयूआरआई को अपडेट करने के लिए,partiallyUpdateAppWidgetको कॉल करने से बचें. ऐसा इसलिए, क्योंकि अधूरे अपडेट,system_serverमें कैश मेमोरी में सेव किए गएRemoteViewsकी हैरारकी में कार्रवाइयां जोड़ते हैं. ऐसा, पहले से तय की गई इमेज को रिलीज़ किए बिना किया जाता है. WorkManagerकी मदद से, बैकग्राउंड में होने वाले काम को सूची में जोड़ें:AppWidgetProvider.onReceiveयाonUpdateसेContext.startForegroundServiceको कॉल न करें. ऐसा करने पर, बैकग्राउंड में ट्रिगर होने परForegroundServiceStartNotAllowedExceptionदिखता है. इसके बजाय,WorkManagerCoroutineWorkerको सूची में जोड़ें. साथ ही, बैकग्राउंड वर्कर सेRemoteViewsको इनफ़्लेट या अपडेट करते समय,context.applicationContextको पास करें.