ऐडवांस विजेट बनाएं

Compose को आज़माएं
Android के लिए, Jetpack Compose को यूज़र इंटरफ़ेस (यूआई) टूलकिट के तौर पर इस्तेमाल करने का सुझाव दिया जाता है. Compose-style API का इस्तेमाल करके विजेट बनाने का तरीका जानें.

इस पेज पर, उपयोगकर्ताओं को बेहतर अनुभव देने के लिए, ज़्यादा बेहतर विजेट बनाने के सुझाव दिए गए हैं.

विजेट के कॉन्टेंट को अपडेट करने के लिए ऑप्टिमाइज़ेशन

विजेट के कॉन्टेंट को अपडेट करने में, काफ़ी कंप्यूटेशनल पावर खर्च हो सकती है. बैटरी की खपत कम करने के लिए, अपडेट के टाइप, फ़्रीक्वेंसी, और समय को ऑप्टिमाइज़ करें.

विजेट से जुड़े अपडेट के टाइप

किसी विजेट को अपडेट करने के तीन तरीके हैं: पूरा अपडेट, कुछ हिस्सा अपडेट करना, और कलेक्शन विजेट के मामले में, डेटा रीफ़्रेश करना. हर एक की कंप्यूटेशनल लागत और नतीजे अलग-अलग होते हैं.

यहां हर अपडेट टाइप के बारे में बताया गया है. साथ ही, हर अपडेट टाइप के लिए कोड स्निपेट दिए गए हैं.

  • पूरा अपडेट: विजेट को पूरी तरह से अपडेट करने के लिए, AppWidgetManager.updateAppWidget(int, android.widget.RemoteViews) को कॉल करें. इससे पहले से मौजूद RemoteViews की जगह नया RemoteViews आ जाएगा. इस अपडेट में सबसे ज़्यादा कंप्यूटेशनल पावर की ज़रूरत होती है.

val appWidgetManager = AppWidgetManager.getInstance(context)
val remoteViews = RemoteViews(context.packageName, R.layout.widgetlayout).apply {
    setTextViewText(R.id.textview_widget_layout1, "Updated text1")
    setTextViewText(R.id.textview_widget_layout2, "Updated text2")
}
appWidgetManager.updateAppWidget(appWidgetId, remoteViews)

  • आंशिक अपडेट: विजेट के कुछ हिस्सों को अपडेट करने के लिए, call AppWidgetManager.partiallyUpdateAppWidget का इस्तेमाल करें. इससे नया RemoteViews, पहले से मौजूद RemoteViews के साथ मर्ज हो जाता है. अगर किसी विजेट को updateAppWidget(int[], RemoteViews) के ज़रिए कम से कम एक बार पूरा अपडेट नहीं मिलता है, तो इस तरीके को नज़रअंदाज़ कर दिया जाता है.

val appWidgetManager = AppWidgetManager.getInstance(context)
val remoteViews = RemoteViews(context.packageName, R.layout.widgetlayout).apply {
    setTextViewText(R.id.textview_widget_layout, "Updated text")
}
appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews)

  • कलेक्शन का डेटा रीफ़्रेश करना: अपने विजेट में कलेक्शन व्यू के डेटा को अमान्य करने के लिए, कॉल AppWidgetManager.notifyAppWidgetViewDataChanged का इस्तेमाल करें. इससे RemoteViewsFactory.onDataSetChanged ट्रिगर होता है. इस बीच, विजेट में पुराना डेटा दिखता है. इस तरीके से, महंगे टास्क को सुरक्षित तरीके से सिंक्रोनस तरीके से पूरा किया जा सकता है.

val appWidgetManager = AppWidgetManager.getInstance(context)
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview)

इन तरीकों को अपने ऐप्लिकेशन में कहीं से भी कॉल किया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि ऐप्लिकेशन का यूआईडी, AppWidgetProvider क्लास के यूआईडी के जैसा हो.

यह तय करना कि विजेट को कितनी बार अपडेट करना है

विजेट, updatePeriodMillis एट्रिब्यूट के लिए दी गई वैल्यू के आधार पर समय-समय पर अपडेट होते हैं. उपयोगकर्ता के इंटरैक्शन, ब्रॉडकास्ट अपडेट या दोनों के जवाब में विजेट अपडेट हो सकता है.

समय-समय पर अपडेट करना

appwidget-provider XML में AppWidgetProviderInfo.updatePeriodMillis के लिए कोई वैल्यू तय करके, समय-समय पर होने वाले अपडेट की फ़्रीक्वेंसी को कंट्रोल किया जा सकता है. हर अपडेट, AppWidgetProvider.onUpdate() तरीके को ट्रिगर करता है. यहां विजेट को अपडेट करने के लिए कोड डाला जा सकता है. हालांकि, अगर आपके विजेट को डेटा को एसिंक्रोनस तरीके से लोड करने की ज़रूरत है या उसे अपडेट होने में 10 सेकंड से ज़्यादा समय लगता है, तो ब्रॉडकास्ट रिसीवर अपडेट के लिए उपलब्ध विकल्पों पर विचार करें. इनके बारे में यहां बताया गया है. ऐसा इसलिए, क्योंकि 10 सेकंड के बाद सिस्टम, BroadcastReceiver को जवाब न देने वाला मान लेता है.

updatePeriodMillis फ़ंक्शन, 30 मिनट से कम की वैल्यू के साथ काम नहीं करता. हालांकि, अगर आपको समय-समय पर होने वाले अपडेट बंद करने हैं, तो 0 डालें.

आपके पास उपयोगकर्ताओं को किसी कॉन्फ़िगरेशन में अपडेट की फ़्रीक्वेंसी को अडजस्ट करने की अनुमति देने का विकल्प होता है. उदाहरण के लिए, उन्हें स्टॉक टिकर को हर 15 मिनट में या दिन में सिर्फ़ चार बार अपडेट करना हो सकता है. इस मामले में, updatePeriodMillis को 0 पर सेट करें और इसके बजाय WorkManager का इस्तेमाल करें.

उपयोगकर्ता के इंटरैक्शन के जवाब में अपडेट

उपयोगकर्ता के इंटरैक्शन के आधार पर, विजेट को अपडेट करने के कुछ सुझाए गए तरीके यहां दिए गए हैं:

  • ऐप्लिकेशन की किसी गतिविधि से: उपयोगकर्ता के इंटरैक्शन के जवाब में सीधे तौर पर AppWidgetManager.updateAppWidget को कॉल करें. जैसे, उपयोगकर्ता का टैप.

  • सूचना या ऐप्लिकेशन विजेट जैसे रिमोट इंटरैक्शन से: PendingIntent बनाएं. इसके बाद, कॉल किए गए Activity, Broadcast या Service से विजेट को अपडेट करें. आपके पास अपनी प्राथमिकता चुनने का विकल्प होता है. उदाहरण के लिए, अगर आपने PendingIntent के लिए Broadcast चुना है, तो BroadcastReceiver को प्राथमिकता देने के लिए, फ़ोरग्राउंड ब्रॉडकास्ट चुना जा सकता है.

ब्रॉडकास्ट इवेंट के जवाब में अपडेट करना

ब्रॉडकास्ट इवेंट का एक उदाहरण यहां दिया गया है. इसमें अपडेट करने के लिए विजेट की ज़रूरत होती है. उदाहरण के लिए, जब उपयोगकर्ता कोई फ़ोटो लेता है. इस मामले में, आपको नई फ़ोटो का पता चलने पर विजेट को अपडेट करना है.

WorkManager का इस्तेमाल करके, काम को शेड्यूल किया जा सकता है. साथ ही, Constraints.Builder.addContentUriTrigger तरीके का इस्तेमाल करके, कॉन्टेंट यूआरआई ट्रिगर सेट किया जा सकता है.

ब्रॉडकास्ट के लिए BroadcastReceiver भी रजिस्टर किया जा सकता है. उदाहरण के लिए, ACTION_LOCALE_CHANGED के लिए सुनना. हालांकि, इससे डिवाइस के संसाधनों का इस्तेमाल होता है. इसलिए, इसका इस्तेमाल सोच-समझकर करें और सिर्फ़ ब्रॉडकास्ट की गई जानकारी सुनें. Android 7.0 (एपीआई लेवल 24) और Android 8.0 (एपीआई लेवल 26) में ब्रॉडकास्ट से जुड़ी पाबंदियां लागू होने के बाद, ऐप्लिकेशन अपने मेनिफ़ेस्ट में इंप्लिसिट ब्रॉडकास्ट रजिस्टर नहीं कर सकते. हालांकि, कुछ अपवादों के साथ ऐसा किया जा सकता है.

BroadcastReceiver से विजेट को अपडेट करते समय ध्यान रखने वाली बातें

अगर विजेट को BroadcastReceiver से अपडेट किया जाता है, तो विजेट अपडेट करने की अवधि और प्राथमिकता के बारे में यहां दी गई बातों का ध्यान रखें. जैसे, AppWidgetProvider.

अपडेट की अवधि

नियम के मुताबिक, सिस्टम ब्रॉडकास्ट रिसीवर को 10 सेकंड तक चलने देता है. ये आम तौर पर ऐप्लिकेशन के मुख्य थ्रेड में चलते हैं. इसके बाद, सिस्टम इन्हें जवाब न देने वाले ब्रॉडकास्ट रिसीवर के तौर पर मार्क करता है और ऐप्लिकेशन काम नहीं कर रहा है (एएनआर) वाली गड़बड़ी ट्रिगर करता है. ब्रॉडकास्ट को हैंडल करते समय, मुख्य थ्रेड को ब्लॉक होने से बचाने के लिए, goAsync तरीके का इस्तेमाल करें. अगर विजेट को अपडेट होने में ज़्यादा समय लगता है, तो WorkManager का इस्तेमाल करके, टास्क शेड्यूल करें.

Caution: Any work you do here blocks further broadcasts until it completes,
so it can slow the receiving of later events.

ज़्यादा जानकारी के लिए, सुरक्षा से जुड़ी बातों और सबसे सही तरीकों के बारे में पढ़ें.

अपडेट की प्राथमिकता

डिफ़ॉल्ट रूप से, ब्रॉडकास्ट—इनमें AppWidgetProvider.onUpdate का इस्तेमाल करके किए गए ब्रॉडकास्ट भी शामिल हैं—बैकग्राउंड प्रोसेस के तौर पर चलते हैं. इसका मतलब है कि सिस्टम के संसाधनों पर ज़्यादा लोड होने की वजह से, ब्रॉडकास्ट रिसीवर को शुरू करने में देरी हो सकती है. ब्रॉडकास्ट को प्राथमिकता देने के लिए, इसे फ़ोरग्राउंड प्रोसेस बनाएं.

उदाहरण के लिए, जब उपयोगकर्ता विजेट के किसी हिस्से पर टैप करता है, तो PendingIntent.getBroadcast को पास किए गए Intent में Intent.FLAG_RECEIVER_FOREGROUND फ़्लैग जोड़ें.