2012-05-07 12 views
6

एंड्रॉइड में दो अलग-अलग प्रक्रियाओं (एक सेवा और गतिविधि) के बीच संचार via Messenger or AIDL प्रबंधित किया जा सकता है: यह पर्याप्त है कि एक गतिविधि किसी सेवा से जुड़ी हो।किसी सेवा और गतिविधि (और इसकी निष्क्रियता) के बीच आईपीसी को कैसे संभालें?

हालांकि, क्या होता है यदि इस गतिविधि में एक या अधिक उप-गतिविधि है? उस क्षण से जब मुख्य गतिविधि उप-गतिविधि शुरू करती है, तो मैं संचार को उप-गतिविधि में रीडायरेक्ट करना चाहता हूं; इसी तरह, जब उप गतिविधि नष्ट हो जाता है, मैं चाहते हैं संचार, वापस मुख्य गतिविधि पर भेज दिया जाएगा आदि ..

उदाहरण # 1:

  1. MyService < --- आईपीसी ---> MainActivity
  2. MainActivity SubActivity, तो MyService < --- आईपीसी ---> SubActivity
  3. SubActivity नष्ट हो जाता है, तो MyService < --- आईपीसी ---> MainActivity शुरूआत

उदाहरण # 2:

  1. MyService < --- आईपीसी ---> MainActivity
  2. MainActivity FirstSubActivity की शुरूआत है, तो MyService < --- आईपीसी ---> FirstSubActivity
  3. FirstSubActivity, SecondSubActivity की शुरूआत तो MyService < --- आईपीसी ---> SecondSubActivity
  4. SecondSubActivity नष्ट हो जाता है, तो MyService < --- आईपीसी ---> FirstSubActivity
  5. FirstSubActivity नष्ट हो जाता है, तो MyServi सीई < --- आईपीसी ---> मुख्य गतिविधि

इन मामलों को कैसे संभालें?

उत्तर

5

आप एक ऐसी इकाई चाहते हैं जो सेवा के लिए बाध्यकारी और कनेक्शन पर होल्डिंग के लिए ज़िम्मेदार है और आपको उस इकाई की गतिविधि गतिविधि होने की आवश्यकता नहीं है। इस प्रयास करें:

  • एक आधार वर्ग (BaseActivity) कि गतिविधि
  • BaseActivity
  • से अपने आवेदन और आपकी सेवा BaseActivity में तरीकों का उपयोग कर के बीच संबंध को प्रबंधित अपने सभी गतिविधियों प्राप्त उपवर्गों बनाएँ। बेसएक्टिविटी में स्थैतिक (वर्ग) चर होना आवश्यक है जो सेवा के कनेक्शन का ट्रैक रखता है और सेवा के लिए बाध्यकारी से निपटता है और जब आप इसके साथ काम करते हैं तो इसे बंद कर देते हैं।
  • सेवा के बाध्यकारी होने पर एप्लिकेशन संदर्भ (गतिविधि संदर्भ नहीं) का उपयोग करना सुनिश्चित करें ताकि ओएस गतिविधि को नष्ट होने पर सेवा से कनेक्शन को मार न सके।

इस तरह आपको विभिन्न गतिविधियों और आपकी सेवा के बीच कनेक्शन बनाने और कम करने के बारे में चिंता करने की ज़रूरत नहीं है। आपके पूरे एप्लिकेशन (सभी गतिविधियों) और आपकी सेवा के बीच केवल एक कनेक्शन है।

मुझे एहसास हुआ कि मैंने सभी गौरी विवरणों को समझाया नहीं है, लेकिन उम्मीद है कि आपको मूल विचार मिल जाएगा।

1

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

+0

[sendBroadcast] के बारे में प्रलेखन (http://developer.android.com/reference/android/content/Context.html#sendBroadcast%28android.content.Intent%29) कहता है कि कोई भी परिणाम रिसीवर और रिसीवर से प्रचारित नहीं होता है प्रसारण को रोक नहीं सकते ._ – enzom83

+0

यह सच है। लेकिन आपके उदाहरणों में मैंने देखा है कि आपने सेवा और गतिविधि के बीच संचार पर हाइलाइट डाले हैं। तो मैंने जो तंत्र पहले वर्णित किया है वह बस है और यदि आप सही रिसीवर और प्रसारण उद्देश्यों का उपयोग करते हैं तो आप अपनी समस्या को पूरा कर सकते हैं। (यह मेरी राय में है) –

+0

निश्चित रूप से, मैं गतिविधि से इरादा प्राप्त करने के लिए गतिविधि में एक प्रसारण रिसीवर का उपयोग कर सकता हूं, और गतिविधि से इरादा प्राप्त करने के लिए सेवा में एक और प्रसारण रिसीवर का उपयोग कर सकता हूं। हालांकि, प्रसारण में एक संदेश भेजकर, यह संभव नहीं है कि इसे केवल एक विशिष्ट पैकेज द्वारा प्राप्त किया जाए, क्योंकि यह 4 से पहले के संस्करणों में समर्थित नहीं है: [_ वैकल्पिक रूप से, ICE_CREAM_SANDWICH से शुरू, आप सुरक्षित रूप से प्रतिबंधित भी कर सकते हैं Intent.setPackage_] के साथ एक ही एप्लिकेशन पर प्रसारित करें (http://developer.android.com/reference/android/content/BroadcastReceiver.html)। – enzom83

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