13

Context.startServiceएंड्रॉयड: प्रारंभ सेवा Context.startService साथ बनाम PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
context.startService(intent); 

PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
PendingIntent pi = PendingIntent.getService(context, 0, intent, 0); 
pi.send(); 


प्रश्न

  1. आप Context.startService बनाम लंबित इंन्टेंट के साथ सेवा कब शुरू करेंगे?
  2. आप एक दूसरे से क्यों उपयोग करेंगे?

उत्तर

18

वास्तव में कोई अंतर नहीं है।

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

एक लंबित इंटेंट एक ऐसा इरादा है जो लंबित है, लंबित है, जिसका अर्थ है कि अब होने वाला नहीं है, लेकिन निकट भविष्य में। जबकि एक इरादे के साथ, यह बहुत पल में भेजा जाता है।

यदि लंबित इंटेन्टेंट का उपयोग होने पर लंबित नहीं है, तो यह अब लंबित नहीं है और यह वास्तव में एक इरादा है। उद्देश्य को पूरी तरह से हराकर

+0

तो, क्या कभी ऐसा समय है जब आप 'लंबित इंटेंट' के साथ सेवा शुरू करना चाहते हैं? –

+2

यदि आप निकट भविष्य में सेवा शुरू करना चाहते हैं, तो यह आदर्श मामला होगा। मान लें कि मेरे पास एक अधिसूचना है जो उपयोगकर्ता के खाते के लिए उपलब्ध नया अपडेट प्रदर्शित करती है। आदर्श रूप से एक लंबित इरादा होगा जो सर्वर से कनेक्ट स्थापित करेगा और इस जानकारी को डाउनलोड करेगा। मैं यह चाहता हूं कि उपयोगकर्ता ने अधिसूचना को तुरंत टैप नहीं किया है, इस तरह मैं उपयोगकर्ता की सुविधा का इंतजार करता हूं, या यदि उपयोगकर्ता परवाह नहीं है तो वे अधिसूचना रद्द कर सकते हैं और अगला नया अपडेट उसी तरह प्रतिक्रिया करेगा। – JoxTraex

+0

ग्रेट स्पष्टीकरण, धन्यवाद! – damluar

1

पेंडिनइन्टेंट्स विजेट्स के लिए बहुत अधिक उपयोग किए जाते हैं। चूंकि चल रहे विजेट का लेआउट आपके कोड से "संबंधित" नहीं है, लेकिन यह सिस्टम के नियंत्रण में है, इसलिए आप सीधे इंटरफ़ेस तत्वों पर श्रोताओं को क्लिक नहीं कर सकते हैं। इस मामले विजेट में एक बटन एक सेवा शुरू होता है में

// get the widget layout 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.id.widget_layout); 

// prepare to listen the clicks on the refresh button 
Intent active = new Intent(context, WidgetCode.UpdateService.class); 
PendingIntent refreshPendingIntent = PendingIntent.getService(context, 0, active, 0); 
remoteViews.setOnClickPendingIntent(R.id.buttonWidgetRefresh, refreshPendingIntent); 

// send the changes to the widget 
AppWidgetManager.getInstance(context).updateAppWidget(appwidgetid, remoteViews); 

: इसके बजाय आप उन तत्वों (बटन) की तरह करने के लिए एक PendingIntent की तरह कुछ आवंटित इसलिए जब उपयोगकर्ता उन्हें छू लेती है, PendingIntent "मार डाला" है। आमतौर पर आप putExtras() के साथ इरादे में अतिरिक्त जानकारी डालते हैं, इसलिए सेवा को अपना काम करने के लिए कोई आवश्यक जानकारी मिल जाएगी।

+0

बस ध्यान दें कि आपको अपनी सेवा को मेनिफेस्ट में जोड़ना है और निर्यात = "सत्य" संपत्ति को इसके महत्वपूर्ण जोड़ना है – Lior

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