2010-09-02 13 views
6

मुझे अपने होमस्क्रीन पर एक विजेट मिला जिस पर मैं एक बटन पर क्लिक जोड़ता हूं। मैं किसी सेवा पर विजेट से विजेट आईडी गुजरती हैं, लेकिन जब im सेवा पर WidgetId पढ़ने यह हमेशा है 3.एंड्रॉइड: एक सेवा के लिए AppWidgetId पास करना

विजेट:

public int onStartCommand(Intent intent, int flags, int startId){ 
    if (intent != null && intent.getExtras() != null) { 

     int widgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 

     // 3 is always printend 
     System.out.println(widgetId); 

     // More stuff here 

    } 
    return super.onStartCommand(intent, flags, startId); 
} 
:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
int[] appWidgetIds) { 

    for (int appWidgetId : appWidgetIds) { 
     RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget); 

     Intent intent = new Intent(context, WidgetService.class); 


     // prints the correct appWidgetId 
     System.out.println(appWidgetId); 


     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

     remoteView.setOnClickPendingIntent(R.id.Button01, pendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetId, remoteView); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

सेवा इस तरह दिखता है

तो मैं गलत क्या कर रहा हूँ?

उत्तर

4

जो आप करने की कोशिश कर रहे हैं वह कुछ चालबाजी के बिना, AFAIK काम नहीं करेगा।

केवल प्रति Intent हो सकता है। इसलिए, यदि आप दो Intents बनाते हैं जो समकक्ष (गैर-अतिरिक्त डेटा पर मिलान) हैं, और आप दो PendingIntents बनाने का प्रयास करते हैं, तो आप अंत में एक ही PendingIntent के साथ हवा में उतरते हैं। Intent का उपयोग किया जाता है जो आप getService() (या getActivity() या getBroadcast()) पर आपूर्ति किए गए झंडे पर थोड़ा सा निर्भर करता है। आपके मामले में, पहले Intent का हमेशा उपयोग किया जाएगा।

यदि आपके पास केवल एक उत्कृष्ट PendingIntent था, लेकिन बस इसके अतिरिक्त अपडेट करना चाहते थे, FLAG_UPDATE_CURRENT काम करेगा। लेकिन, आप एन बकाया PendingIntents चाहते हैं।

आपके मामले में यह काम करने का एकमात्र तरीका यह है कि Intent में एक अद्वितीय क्रिया स्ट्रिंग डालना है। चूंकि आप घटक निर्दिष्ट कर रहे हैं (WidgetService.class), रूटिंग के लिए एक्शन स्ट्रिंग का उपयोग नहीं किया जाएगा। हालांकि, यह आपको PendingIntent ऑब्जेक्ट्स देने के लिए पर्याप्त होगा।

3

बस ऊपर टिप्पणी में जोड़ने के लिए, कैसे अपने इरादे अद्वितीय बनाने के लिए के लिए इस उदाहरण देखें: http://developer.android.com/resources/samples/StackWidget/src/com/example/android/stackwidget/StackWidgetProvider.html यह सचमुच एक गूंगा डिजाइन और एक भी बदतर वैकल्पिक हल की तरह लगता है, लेकिन मुझे लगता है कि इस तरह से यह है। उपरोक्त सरल उदाहरण खोजने में मुझे काफी समय लगा। Intent.setData (उरी) कॉल पर विशेष ध्यान दें। मैंने उन लाइनों को मेरी ऑनअपडेट() विधि में काट दिया और चिपकाया और अंत में काम किया।

+0

महान ढूंढते हैं। मैं थोड़ी देर के लिए इस समस्या को हल करने की कोशिश कर रहा हूं, और इसके साथ-साथ बेस-लाइन उदाहरण में भी। गीज़। बहुत बहुत धन्यवाद! – icecreamman

0

इसे ठीक करने का एक आसान तरीका है। बदलें

PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

करने के लिए
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

http://developer.android.com/reference/android/app/PendingIntent.html

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