दोनों को कैसे करना है, मैं एक परेशान प्रश्न पूछ रहा हूं जो (आंशिक रूप से, मेरे दिमाग में) here और here को संबोधित किया गया है। आइए मान लें कि कई उदाहरणों में हम एक ही गतिविधि और सेवा का उपयोग करके एक संगीत एप्लिकेशन बनाना चाहते हैं। हम चाहते हैं कि जब गतिविधि बंद हो या नष्ट हो जाए तो सेवा जारी रहेगी। जीवन चक्र इस तरह की एक शुरू कर दिया सेवा पता चलता है:बाध्य सेवा बनाम एंड्रॉइड पर सेवा शुरू हुई और
एक सेवा "शुरू कर दिया" है एक आवेदन घटक (जैसे कि एक गतिविधि के रूप में) startService को फोन करके यह शुरू होता है जब()। एक बार शुरू कर दिया, एक सेवा अनिश्चित काल के लिए पृष्ठभूमि में चला सकते हैं, भले ही घटक है कि शुरू कर दिया यह
ठीक नष्ट कर दिया है, लेकिन हम भी सेवा के साथ संवाद करने में सक्षम होना चाहता हूँ, इसलिए हम एक सेवा बंधन की जरूरत है ।
- गतिविधि स्टार्टअप पर (या कुछ अन्य बिंदु) हम startService()
- फोन है कि हम bindService() फोन IBinder इंटरफ़ेस प्राप्त है, और वहाँ से आगे बढ़ने के लिए लेने के बाद: कोई बात नहीं, हम this answer suggests के रूप में दोनों एक बाध्य और शुरू कर दिया सेवा है ।
अब तक तो अच्छा है, लेकिन एक समस्या यह है कि जब गतिविधि शुरू होता है, हम अगर सेवा के आसपास है या नहीं पता नहीं है से उठता है। यह शुरू हो सकता है या ऐसा नहीं हो सकता है। इस सवाल का जवाब हो सकता है कुछ की तरह:
- स्टार्टअप पर,, सेवा (BIND_AUTO_CREATE झंडा बिना bindService() का उपयोग करें)
- करने के लिए बाध्य करने की कोशिश अगर यह काम नहीं तो
startService()
का उपयोग कर सेवा को प्रारंभ करने, और फिर इसे करने के लिए बाध्य।
यह विचार bindService()
के लिए किए गए दस्तावेज़ों की एक विशेष पढ़ने पर आधारित है:
कनेक्ट एक आवेदन सेवा करने के लिए, इसे बनाने यदि आवश्यक हो तो।
यदि शून्य ध्वज का अर्थ है कि हम ठीक से "सेवा की ज़रूरत नहीं है"।
private void connectToService() {
Log.d("MainActivity", "Connecting to service");
// We try to bind to an existing service
Intent bindIntent = new Intent(this, AccelerometerLoggerService.class);
boolean bindResult = bindService(bindIntent, mConnection, 0);
if (bindResult) {
// Service existed, so we just bound to it
Log.d("MainActivity", "Found a pre-existing service and bound to it");
} else {
Log.d("MainActivity", "No pre-existing service starting one");
// Service did not exist so we must start it
Intent startIntent = new Intent(this, AccelerometerLoggerService.class);
ComponentName startResult = startService(startIntent);
if (startResult==null) {
Log.e("MainActivity", "Unable to start our service");
} else {
Log.d("MainActivity", "Started a service will bind");
// Now that the service is started, we can bind to it
bindService(bindIntent, mConnection, 0);
if (!bindResult) {
Log.e("MainActivity", "started a service and then failed to bind to it");
} else {
Log.d("MainActivity", "Successfully bound");
}
}
}
}
और क्या हम मिल एक सफल बाध्यकारी हर बार है:: तो हम निम्नलिखित कोड का उपयोग कर कुछ इस तरह की कोशिश
04-23 05:42:59.125: D/MainActivity(842): Connecting to service
04-23 05:42:59.125: D/MainActivity(842): Found a pre-existing service and bound to it
04-23 05:42:59.134: D/MainActivity(842): onCreate
वैश्विक सवाल "मैं शुरू कर दिया और कैसे बनाम बाध्य गलतफहमी रहा हूँ उनका उपयोग करने के लिए? " अधिक विशिष्ट प्रश्न हैं:
- क्या यह दस्तावेज़ों की सही समझ है कि
bindService()
पर शून्य ध्वज का मतलब है "सेवा शुरू न करें"? यदि नहीं, तो सेवा शुरू किए बिनाbindService()
पर कॉल करने का कोई तरीका नहीं है? bindService()
true
क्यों लौटाता है भले ही सेवा नहीं चल रही हो? इस मामले में ऐसा लगता है किLog
कॉल के आधार पर सेवा शुरू हो गई है।- यदि पिछले बिंदु सही/
bindService()
से अपेक्षित व्यवहार है, वहाँ एक समाधान नहीं है (अर्थात किसी भी तरह सुनिश्चितstartService
कहा जाता है कि केवल यदि सेवा नहीं चल रहा है?)
पी.एस. मैं अपने कोड में समस्या से आगे बढ़ गया हूं: मैं startService()
कॉल जारी करता हूं, क्योंकि startService()
को बार-बार अनदेखा किया जाता है। हालांकि, मैं अभी भी मुद्दों को बेहतर समझना चाहता हूं।
मैं पूरी तरह से समझता हूं कि यह कैसे काम करता है, लेकिन [यह] (http://www.101apps.co.za/articles/bound-services-what-you-should-know.html) और [यह] (http://www.101apps.co.za/articles/binding-to-a-service-a-tutorial.html) आपकी मदद कर सकता है। –