2012-08-02 3 views
5

अद्यतन पर ट्रिगर करने से रोकें मैं एक विजेट को कार्यान्वित कर रहा हूं जिसमें कॉन्फ़िगरेशन एक्टिविटी है, और एक्लेयर (2.1) के अनुकूल होना चाहिए।विजेटप्रोवाइडर

documentation AppWidgetProviders के बारे में onUpdate विधि स्पष्ट रूप से कहा गया है कि:

... .हालांकि, अगर आप एक विन्यास गतिविधि घोषणा की है, इस विधि नहीं बुलाया जाता है तो उपयोगकर्ता ऐप्स विजेट लेता है, लेकिन कहा जाता है जब बाद के अपडेट के लिए। कॉन्फ़िगरेशन पूर्ण होने पर पहला अपडेट करने के लिए कॉन्फ़िगरेशन गतिविधि की ज़िम्मेदारी है। (नीचे एक ऐप विजेट कॉन्फ़िगरेशन गतिविधि बनाना देखें।)

दुर्भाग्य से यह सच नहीं है (कम से कम मेरे नेक्सस एस के लिए जेलीबीन के साथ)। तथ्य onUpdate में कोonCreate से पहले मेरे कॉन्फ़िगरेशन एक्टिविटी ट्रिगर्स कहा जाता है। मैं जानना चाहता हूं, अगर अन्य फोन पर समान व्यवहार है, और यदि मेरे प्रदाता के अंदर onUpdate कॉल को रोकना संभव है?

मेरा वर्कअराउंड उस विशेष AppWidgetId के साथ मेरे विजेट कॉन्फ़िगरेशन एक्टिविटी के अंदर साझा किए गए संदर्भों में ध्वज संग्रहीत करना है। यदि यह वहां नहीं है, तो मैं मान सकता हूं कि कॉन्फ़िगरेशनएक्टिविटी को पहले नहीं कहा गया था। यह काम करता है, लेकिन मेरे दृष्टिकोण में वास्तव में बदसूरत है। अगर मैं ट्रिगरिंग से onUpdate को रोक नहीं सकता, तो क्या कोई बेहतर समाधान है?

+0

हाँ इसे कॉल किया जाता है। गलत दस्तावेज़ों का एक और टुकड़ा - यहां तक ​​कि Google को कभी-कभी चीज़ें गलत होती हैं। –

+0

मैंने एंड्रॉइड संस्करण, डिवाइस या एमुलेटर –

उत्तर

4

हां, ऑनअपडेट() को होमस्क्रीन पर विजेट जोड़ने पर कॉल किया जाता है। यहाँ देखें:

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

http://developer.android.com/reference/android/appwidget/AppWidgetManager.html#ACTION_APPWIDGET_UPDATE

मुझे यकीन है कि नहीं कर रहा हूँ अगर वहाँ एक तरह से यह ट्रिगर नहीं करने के लिए जब एक विजेट बनाया जाता है। लेकिन आप विजेट जानकारी XML फ़ाइल में पर या "खाली छोड़कर" अपडेटपेरियोडमिलिस "फ़ील्ड को सेट करके फिर से ट्रिगर करने से रोक सकते हैं।

एक और तरीका विजेट आईडी को कहीं और स्टोर करना होगा। अब जब भी कोई नया विजेट जोड़ा जाता है, तो अपने रिसीवर क्लास में, जांचें कि आईडी पहले से मौजूद है या नहीं। यदि यह अस्तित्व में नहीं है (जिसका अर्थ है एक नया विजेट), तो किसी भी कोड को निष्पादित न करें। साथ ही, विजेट को हटाए जाने पर अपने रिकॉर्ड से विजेट आईडी हटा दें। चूंकि एक संभावना है कि आपने एक विजेट हटा दिया है, उसके बाद बाद में एक नया विजेट जोड़ा गया है जिसमें पुराने आईडी के समान आईडी है।

आशा है कि मदद करता है!

संपादित करें: अपने रिसीवर कक्षा में onReceive() विधि में, इस कार्य करें:

public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 

    int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 
    if(appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) 
    { 
     super.onReceive(context, intent); 
    } 

} 

एक विजेट पहले विजेट सूची से चयनित किया जाता है, इसके appWidgetId INVALID_APPWIDGET_ID के बराबर हो जाएगा जब तक यह जोड़ा जाता है होम स्क्रीन पर। चूंकि "super.onReceive()" विजेट अद्यतन होने पर ऑन अपडेट() विधि को कॉल करता है, तोUpdate() को पहली बार नहीं कहा जाएगा।

+0

पर ध्यान दिए बिना, कॉन्फ़िगरेशन गतिविधि के निर्माण से पहले हर बार कहा जाता है। मैं वास्तव में सोच रहा हूं: अपडेट-डॉक: 'यह इस ऐपविड्ज प्रदाता के लिए एक नए उदाहरण के जवाब में भेजा जा सकता है तत्काल अपडेट किया गया, अनुरोधित अद्यतन अंतराल समाप्त हो गया है, या सिस्टम बूटिंग। ** ** वीएस ** 'यदि आपने कॉन्फ़िगरेशन गतिविधि घोषित की है, तो उपयोगकर्ता को ऐप विजेट जोड़ने पर यह विधि नहीं कहा जाता है। 'मैंने पहले से ही अद्यतन अंतराल सेट कर दिया है "0", और मैं पहले से ही करता हूं, आपने जो सुझाव दिया है (साझा किए गए आईडी के अंदर आईडी संग्रहित करना)। –

+0

पहली बार अद्यतन() पर कॉल करने का कोई तरीका नहीं मिला। मेरे संपादित उत्तर की जांच करें। यह ठीक काम कर रहा है मैंने अभी अपने आवेदन में इसे लागू किया है। –

+0

मुझे पहली बार मेरे प्रदाता ट्रिगर होने पर 'AppWidgetManager.INVALID_APPWIDGET_ID' नहीं मिला। वास्तव में यह सही आईडी है, वही है, कि मेरी 'AppWidgetConfigActivity' प्राप्त होगी। (जेलीबीन गैलेक्सी नेक्सस) –

0

मुझे यह त्रुटि भी मिली है।

यहां तक ​​कि मैं अपडेट पेरियोडमिलिस को 0 पर सेट करता हूं। विजेट गतिविधि कॉन्फ़िगरेशन शुरू करने से पहले मेरा ऑनअपडेट चल रहा है। मुझे लगता है कि यह एंड्रॉइड विजेट में एक बग है।

मैं intentClick.setAction(WIDGET_CLICKED); जो केवल जब विजेट पर क्लिक ट्रिगर किया जाता है कहा:

0

मैं देखने के लिए अगर विजेट क्लिक किया गया था onUpdate में आशय की जाने वाली कार्रवाई को जोड़ने तो बनाकर एक अगर जांच onReceive इस समस्या का समाधान।

public class WidgetProvider extends AppWidgetProvider { 

    private static final String TAG = WidgetProvider.class.getSimpleName(); 
    private static String WIDGET_CLICKED = "widget_clicked"; 

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    Log.e(TAG, "onUpdate()"); 

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
    watchWidget = new ComponentName(context, WidgetProvider.class); 

    Intent intentClick = new Intent(context, WidgetProvider.class); 
    intentClick.setAction(WIDGET_CLICKED); 
    intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, "" + appWidgetIds[0]); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetIds[0], intentClick, 0); 
    remoteViews.setOnClickPendingIntent(R.id.img_btn, pendingIntent); 
    remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play); 

    appWidgetManager.updateAppWidget(watchWidget, remoteViews); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 

    Log.e(TAG, "onReceive()"); 
    Bundle extras = intent.getExtras(); 

    //If AND ONLY IF WIDGET_CLICKED 
    if (extras != null && intent.getAction().equals(WIDGET_CLICKED)) { 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 

     //If isPlaying 
     if (isPlaying) { 
      //setBackground as PLAY 
      remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play); 
      isPlaying = false; 

      Intent i = new Intent(context, MediaPlayerService.class); 
      i.putExtra("command", "stopSong"); 
      context.startService(i); 

      //If NOT playing 
     } else { 
      //setBackground as STOP 
      remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.stop); 
      isPlaying = true; 

      Intent i = new Intent(context, MediaPlayerService.class); 
      i.putExtra("command", "playRandomSong"); 
      context.startService(i); 
     } 

     watchWidget = new ComponentName(context, WidgetProvider.class); 

     (AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews); 
    } 
}