यहां दिए गए सेक्शन में, GlanceAppWidget को अपडेट करने और उसकी स्थिति को मैनेज करने का तरीका बताया गया है.
GlanceAppWidget की स्थिति मैनेज करना
जब भी विजेट बनाया जाता है या उसे अपडेट करने की ज़रूरत होती है, तब दी गई GlanceAppWidget क्लास को इंस्टैंशिएट किया जाता है. इसलिए, यह स्टेटलेस और पैसिव होनी चाहिए.
स्टेटस को इन कैटगरी में बांटा जा सकता है:
- ऐप्लिकेशन की स्थिति: ऐप्लिकेशन की वह स्थिति या कॉन्टेंट जिसकी ज़रूरत विजेट को होती है. उदाहरण के लिए, उपयोगकर्ता की ओर से सेव की गई जगहों की सूची (यानी कि डेटाबेस).
- Glance स्टेट: यह एक खास स्टेट है, जो सिर्फ़ ऐप्लिकेशन विजेट के लिए काम की होती है. इससे ऐप्लिकेशन के स्टेट में बदलाव होना या उस पर असर पड़ना ज़रूरी नहीं है. उदाहरण के लिए, विजेट में कोई चेकबॉक्स चुना गया था या काउंटर बढ़ाया गया था.
ऐप्लिकेशन की स्थिति का इस्तेमाल करना
ऐप्लिकेशन विजेट पैसिव होने चाहिए. हर ऐप्लिकेशन, डेटा लेयर को मैनेज करने और विजेट के यूज़र इंटरफ़ेस (यूआई) में दिखने वाली स्थितियों को हैंडल करने के लिए ज़िम्मेदार होता है. जैसे, आइडल, लोड हो रहा है, और गड़बड़ी.
उदाहरण के लिए, यह कोड रिपॉज़िटरी लेयर से इन-मेमोरी कैश मेमोरी में मौजूद डेस्टिनेशन को वापस लाता है. साथ ही, सेव किए गए डेस्टिनेशन की सूची उपलब्ध कराता है और उसकी स्थिति के आधार पर एक अलग यूज़र इंटरफ़ेस (यूआई) दिखाता है:
class DestinationAppWidget : GlanceAppWidget() { // ... @Composable fun MyContent() { val repository = remember { DestinationsRepository.getInstance() } // Retrieve the cache data everytime the content is refreshed val destinations by repository.destinations.collectAsState(State.Loading) when (destinations) { is State.Loading -> { // show loading content } is State.Error -> { // show widget error content } is State.Completed -> { // show the list of destinations } } } }
जब भी स्थिति या डेटा में बदलाव होता है, तो ऐप्लिकेशन की ज़िम्मेदारी होती है कि वह विजेट को सूचना दे और उसे अपडेट करे. ज़्यादा जानकारी के लिए, GlanceAppWidget को अपडेट करना लेख पढ़ें.
GlanceAppWidget को अपडेट करें
GlanceAppWidget का इस्तेमाल करके, विजेट के कॉन्टेंट को अपडेट करने का अनुरोध किया जा सकता है. GlanceAppWidget की स्थिति को मैनेज करना सेक्शन में बताया गया है कि ऐप्लिकेशन विजेट को एक अलग प्रोसेस में होस्ट किया जाता है. Glance, कॉन्टेंट को असल RemoteViews में अनुवाद करता है और उन्हें होस्ट को भेजता है. कॉन्टेंट अपडेट करने के लिए, Glance को RemoteViews फिर से बनाने होंगे और उन्हें फिर से भेजना होगा.
अपडेट भेजने के लिए, GlanceAppWidget इंस्टेंस के update तरीके को कॉल करें. साथ ही, context और glanceId उपलब्ध कराएं:
MyAppWidget().update(context, glanceId)
glanceId पाने के लिए, GlanceAppWidgetManager से क्वेरी करें:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
इसके अलावा, इनमें से किसी एक GlanceAppWidget update एक्सटेंशन का इस्तेमाल करें:
// Updates all placed instances of MyAppWidget MyAppWidget().updateAll(context) // Iterate over all placed instances of MyAppWidget and update if the state of // the instance matches the given predicate MyAppWidget().updateIf<State>(context) { state -> state == State.Completed }
इन तरीकों को आपके ऐप्लिकेशन के किसी भी हिस्से से कॉल किया जा सकता है. ये suspend फ़ंक्शन हैं. इसलिए, हमारा सुझाव है कि इन्हें मुख्य थ्रेड के स्कोप से बाहर लॉन्च करें. यहां दिए गए उदाहरण में, उन्हें CoroutineWorker में लॉन्च किया गया है:
class DataSyncWorker( val context: Context, val params: WorkerParameters, ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { // Fetch data or do some work and then update all instance of your widget MyAppWidget().updateAll(context) return Result.success() } }
कोरूटीन के बारे में ज़्यादा जानने के लिए, Android पर Kotlin कोरूटीन देखें.
विजेट कब अपडेट करें
विजेट को तुरंत या समय-समय पर अपडेट करना.
जब आपका ऐप्लिकेशन चालू हो, तब आपका विजेट तुरंत अपडेट हो सकता है. उदाहरण के लिए:
- जब कोई उपयोगकर्ता किसी विजेट के साथ इंटरैक्ट करता है, तो कोई कार्रवाई, लैम्ब्डा कॉल या किसी गतिविधि को लॉन्च करने का इंटेंट ट्रिगर होता है.
- जब उपयोगकर्ता, फ़ोरग्राउंड में आपके ऐप्लिकेशन के साथ इंटरैक्ट करता है या जब ऐप्लिकेशन, Firebase क्लाउड से मैसेज (FCM) या ब्रॉडकास्ट के जवाब में पहले से ही अपडेट हो रहा हो.
ऐसे मामलों में, इस गाइड में बताए गए तरीके से update मेथड को कॉल करें.
जब आपका ऐप्लिकेशन चालू न हो, तब भी आपका विजेट समय-समय पर अपडेट हो सकता है. उदाहरण के लिए:
- विजेट को हर 30 मिनट में एक बार अपडेट करने के लिए,
updatePeriodMillisका इस्तेमाल करें. WorkManagerका इस्तेमाल करके, अपडेट को ज़्यादा बार शेड्यूल करें. जैसे, हर 15 मिनट में.- ब्रॉडकास्ट के जवाब में विजेट को अपडेट करना.