2013-04-23 20 views
9

दोनों को कैसे करना है, मैं एक परेशान प्रश्न पूछ रहा हूं जो (आंशिक रूप से, मेरे दिमाग में) 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() को बार-बार अनदेखा किया जाता है। हालांकि, मैं अभी भी मुद्दों को बेहतर समझना चाहता हूं।

+0

मैं पूरी तरह से समझता हूं कि यह कैसे काम करता है, लेकिन [यह] (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) आपकी मदद कर सकता है। –

उत्तर

2
  1. यदि आप 0 ध्वज के साथ सेवा को बाध्य करते हैं तो सेवा शुरू नहीं होगी। आप BIND_AUTO_CREATE ध्वज के साथ सेवा को बाध्य कर सकते हैं और यदि सेवा शुरू नहीं हुई है, तो यह शुरू हो जाएगी। हालांकि, जब आप अनइंड करते हैं सेवा सेवा नष्ट हो जाएगी।
  2. 0 ध्वज के साथ बाइंड सेवा हमेशा सत्य लौटती है।
  3. आप हमेशा स्टार्ट सेवा को कॉल कर सकते हैं। अगर सेवा पहले से चल रही है तो एक नई सेवा नहीं बनाई जाएगी। स्टार्ट कमांड पर चल रही सेवा को बुलाया जाएगा।

यदि आप शुरू करते हैं तो सेवा में सेवा शुरू करने में कोई समस्या नहीं होनी चाहिए और फिर बाईस सेवा पर रीज्यूम और अनइंड सेवा पर रोकें।

+0

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

+0

जब तक आप StopService को कॉल नहीं करते हैं, तब तक आपके संगीत को –

+0

खेलना जारी रखना चाहिए, लेकिन अगली बार गतिविधि दिखायी जाती है, 'startService() 'को' onrereate() 'से कॉल किया जाएगा, और हम एक ही मुद्दे पर वापस आ गए हैं। – angelatlarge

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