2010-12-12 17 views
8

से अपडेट नहीं होगा I have a simple appwidget है और जब मैं किसी गतिविधि में एक क्रिया (उसी ऐप में) होता हूं तो मैं इसे अपडेट करना चाहता हूं। ऑनअपडेट() में, मैं तुरंत विजेट अपडेट करता हूं, जो ठीक काम करता है। मेरी गतिविधि में, मैं अपने ऐपविजेट में एक ही स्थिर अद्यतन विधि को कॉल करता हूं जिसे दृश्य अपडेट करने के लिएUpdate() में कहा जाता है। विजेट अद्यतन नहीं है।एंड्रॉइड ऐपविजेट गतिविधि

मैं कोड को सीधे AppWidgetManager.updateAppWidget() विधि में ढूंढ सकता हूं, और यह सब अच्छा है, लेकिन विजेट अपडेट नहीं होता है।

एकमात्र संभावित अंतर जो मैं देख सकता हूं वह यह है कि मेरी स्थिर अद्यतन विधि में पारित संदर्भ वस्तु अलग है, जब इसे किसी गतिविधि के संदर्भ से कहा जाता है जिसे एक एपविजेट की ऑनअपडेट() विधि के संदर्भ में कहा जाता है। हालांकि, इस पर वेब पर बहुत से उदाहरण हैं इसलिए मुझे उम्मीद है कि इसे काम करना चाहिए।

उत्तर

19

अपना कोड देखे बिना मुझे 100% यकीन नहीं है कि आप इसे कैसे करने की कोशिश कर रहे हैं, हालांकि यहां मैं जिस विधि का उपयोग करता हूं। मेरी Activity के भीतर मैं निम्न विधि है:

private void updateAllWidgets(){ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class)); 
    if (appWidgetIds.length > 0) { 
     new MyWidget().onUpdate(this, appWidgetManager, appWidgetIds); 
    } 
} 

कहाँ MyWidget appwidget का वर्ग है। मैं अपने सभी एपविड्ज अपडेट करने के लिए अपने Activity के भीतर कहीं भी इस विधि को कॉल कर सकता हूं।

+1

कर दिया कि चीजें काम के रिसीवर टैग के अंदर है, तो समस्या होना चाहिए कि मैं अद्यतन करने नहीं किया गया था सही आईडी जैसा कि था, विजेट अपनी आईडी के साथ एक ऑनक्लिक इरादा सेट करता है, जिसे गतिविधि द्वारा प्राप्त किया जाता है, जो तब विजेट को स्वयं अपडेट करने के लिए कहता है। –

+0

मुझे नहीं लगता कि ऑन अपडेट विधि को कॉल करना सही दृष्टिकोण है। आपको AppWidgetManager.ACTION_APPWIDGET_UPDATE के लिए प्रसारण भेजना चाहिए। – midhunhk

+0

@ सिल्वरबैक "इसे सही तरीके से करने" दृष्टिकोण से, मैं आपसे सहमत हूं कि ऐसा करने का सही तरीका प्रसारण भेजना है। "बस इसे काम करें" दृष्टिकोण से, उपर्युक्त ऐप विजेट अपडेट करने का कारण बन जाएगा - गंदे लेकिन कार्यात्मक। –

9

एक स्थिर विधि का उपयोग करने के बजाय इस तथ्य का लाभ उठाएं कि विजेट पहले से ही एक प्रसारण रिसीवर है और आपके मैनिफेस्ट में इसके लिए एक अपडेट इरादा पंजीकृत है। इसके बाद जब भी आप गतिविधि से यह अद्यतन करने की आवश्यकता सिर्फ फोन

//in your activity 
sendBroadcast(new Intent(MyWidget.ACTION_UPDATE).putExtra(whatever)); 



//In widget class 
public static final String ACTION_UPDATE = "com.example.UPDATE_MY_WIDGET"; 

और अपने मैनिफ़ेस्ट फ़ाइल

<intent-filter> 
    <action android:name="com.example.UPDATE_MY_WIDGET"/> 
</intent-filter> 
+0

मैं यह कर रहा था, लेकिन मैंने इसे बदल दिया ताकि विजेट सिर्फ एक इरादा सेवा शुरू कर सके। क्यूं कर? विजेट संभावित रूप से लंबे समय तक चलने वाला ऑपरेशन करता है। मैं विजेट में एएनआर प्राप्त कर रहा था जब यहUpUpate() तुरंत वापस नहीं आया था। सुनिश्चित नहीं है कि यह मेरी समस्या से संबंधित है या नहीं। –

+0

हाँ किसी भी लंबे ऑपरेशन को एक IntentService, AsyncTask या किसी अन्य प्रकार के थ्रेडिंग का उपयोग करना चाहिए। मेरा जवाब यह है कि मैं आपके विजेट को सूचित करने के बारे में कैसे जाऊंगा कि कार्य शुरू करने का समय - या- अपने विजेट को सूचित करने के लिए कि कार्य पूरा हो गया है और इसे अपने राज्य को अपडेट करने की आवश्यकता है। – schwiz

+0

@schwiz बहुत समय पहले लेकिन फिर भी, आपको लंबे ऑपरेशन करने के लिए अपने onUpdate() में एक सेवा शुरू करनी चाहिए। मुझे लगता है कि रिसीवर निष्पादित करने के लिए लगभग 5 सेकंड हो जाता है। एक AsyncTask बनाना अपर्याप्त है क्योंकि रिसीवर नष्ट हो जाने पर भी यह मारा जाएगा। – HGPB

संबंधित मुद्दे