इस पेज पर, बेहतर उपयोगकर्ता अनुभव के लिए ज़्यादा ऐडवांस विजेट बनाने के सुझाए गए तरीकों के बारे में बताया गया है.
विजेट के कॉन्टेंट को अपडेट करने के लिए ऑप्टिमाइज़ेशन
विजेट के कॉन्टेंट को अपडेट करने में, कंप्यूटेशनल रिसॉर्स का ज़्यादा इस्तेमाल हो सकता है. बैटरी की खपत कम करने के लिए, अपडेट के टाइप, फ़्रीक्वेंसी, और समय को ऑप्टिमाइज़ करें.
विजेट के अपडेट के टाइप
विजेट को अपडेट करने के तीन तरीके हैं: पूरा अपडेट, कुछ हिस्सों का अपडेट, और कलेक्शन विजेट के मामले में, डेटा रीफ़्रेश करना. हर एक की कंप्यूटेशनल लागत और नतीजे अलग-अलग होते हैं.
यहां हर तरह के अपडेट के बारे में बताया गया है. साथ ही, हर अपडेट के लिए कोड स्निपेट दिए गए हैं.
- पूरा अपडेट: विजेट को पूरी तरह से अपडेट करने के लिए,
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)
- कुछ हिस्सों को अपडेट करना: विजेट के कुछ हिस्सों को अपडेट करने के लिए,
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 एक्सएमएल में 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 फ़्लैग जोड़ें.