2010-03-19 6 views
7

मैं एक गतिविधि और एक सेवा के बीच दो-तरफा संचार स्थापित करने पर काम कर रहा हूं जो एक अलग प्रक्रिया में चलता है।विभिन्न प्रक्रियाओं में गतिविधि और सेवा के बीच दो-तरफा संचार कैसे स्थापित करें?

गतिविधि से प्रक्रिया की क्वेरी करना कोई बड़ा सौदा नहीं है। लेकिन मैं प्रक्रियाओं पर गतिविधि को सूचित करने की प्रक्रिया चाहता हूं। इसके पीछे विचार यह है: सेवा वास्तविक ऐप से स्वतंत्र रूप से चलती है। यह समय-समय पर एक वेबसर्वर से पूछताछ करता है। यदि वेबसर्वर पर एक नया कार्य पाया जाता है तो प्रक्रिया को गतिविधि को सूचित करना चाहिए।

मुझे this thread पर AndDev.org पर मिला लेकिन यह मेरे लिए काम नहीं कर रहा है। मैं BroadcastReceiver के साथ गड़बड़ कर रहा हूँ। मैंने एक इंटरफ़ेस लागू किया है जो गतिविधि को सूचित करना चाहिए लेकिन समस्या यह है कि श्रोता हमेशा शून्य नहीं होता है क्योंकि प्रक्रिया से ब्रॉडकास्ट इरादे के माध्यम से किया जाता है, इसलिए ब्रॉडकास्ट रिसीवर को विस्तारित करने वाली कक्षा को तुरंत चालू किया जाएगा।

मैं 2-तरफा संचार कैसे स्थापित कर सकता हूं? यह संभव होना चाहिए। किसी भी मदद के लिए धन्यवाद,

Steff

+0

क्या आप विस्तार से बता सकते हैं कि "गतिविधि से प्रक्रिया को पूछना कोई बड़ा सौदा नहीं है"> वास्तव में आप इसे कैसे करते हैं? क्या आप सेवा से बंधे हैं? – Radu

उत्तर

4

या तो BroadcastReceiver का उपयोग करें या Activity register a callback or listener object है कि Service प्रमुख घटनाओं पर कॉल करता है। उपर्युक्त लिंक उन तकनीकों को प्रदर्शित करने वाली उदाहरण परियोजनाओं को बुक करना है।

+0

क्या मैं अपनी गतिविधि के अंदर ब्रॉडकास्ट रिसीवर का उपयोग कर सकता हूं या क्या मुझे एक अलग वर्ग बनाना है? क्या मुझे इरादे के लिए ब्रॉडकास्ट रिसीवर का विस्तार करने वाला वर्ग निर्दिष्ट करना है? – stfn

+0

'ब्रॉडकास्ट रिसीवर' एक वर्ग है - एक वर्ग दोनों 'गतिविधि' और 'ब्रॉडकास्ट रिसीवर' नहीं हो सकता है। आप 'ब्रॉडकास्ट रिसीवर' के लिए अपनी 'गतिविधि' की आंतरिक कक्षा का उपयोग कर सकते हैं, जैसा ऊपर से जुड़े नमूना कोड में प्रदर्शित किया गया है। आप अपने प्रसारण 'इरादों' के लिए घटक नामों का उपयोग कर सकते हैं, लेकिन इसके लिए एक सार्वजनिक 'ब्रॉडकास्ट रिसीवर' कक्षा की आवश्यकता होती है। या आप ऊपर से जुड़े नमूना कोड में दिखाए गए अनुसार कस्टम एक्शन स्ट्रिंग का उपयोग कर सकते हैं। – CommonsWare

+0

धन्यवाद, लेकिन मैं वास्तव में यकीन है कि अगर एक BroadcastReceiver अच्छी तरह से अनुकूल के बाद से है कि मैं क्या चाहता हूँ एक के रूप में लंबे समय के रूप में संभव चल प्रक्रिया है जो वास्तविक आवेदन से स्वतंत्र है है नहीं कर रहा हूँ। यह एक नया ईमेल की तरह स्टेटस बार में एक अधिसूचना दिखाने में सक्षम होना चाहिए, भले ही वास्तविक एप्लिकेशन नहीं चल रहा हो। तो इसका मतलब है कि मुझे bindService (इरादा, कनेक्शन, झंडे) के बजाय startService (मंशा) के माध्यम से एक सेवा शुरू करनी है, है ना? मैं ApiDemos 'RemoteServiceClient' को समझने की कोशिश कर रहा हूं लेकिन पेटी से असफल रहा।जितना अधिक मैं 'उदाहरण' को और अधिक उलझन में देखता हूं ... – stfn

2

मुझे लगता है कि आप आशय में परिणाम के साथ फिर से BroadcastReceiver अपनी गतिविधि शुरू होनी चाहिए।

या आप एआईडीएल के बारे में AIDL का उपयोग कर सकते हैं। नमूने में एक (एकाधिक?) उदाहरण भी है जो एआईडीएल और सेवाओं का उपयोग कैसे करें। लेकिन AIDL आपके उद्देश्य के लिए परेशानी का हो सकता है।

+0

... मेरी गतिविधि फिर से शुरू करें? यही वह है जिसे मैं टालने की कोशिश कर रहा हूं ... एआईडीएल वास्तव में एक परेशानी है लेकिन जाने के रास्ते की तरह दिखती है। अब मैं ApiDemos से RemoteService बाइंडिंग को समझने की कोशिश कर रहा हूं। मजबूत। – stfn

2

इरादों को प्राप्त करने के लिए आपको BroadcastReceiver का उपयोग करना होगा, और जब आप संवाद करना चाहते हैं तो उचित मूल्यों के साथ केवल एक इरादा बनाएं।

इस तरह से आप किसी भी घटक के बीच 2-तरफा संचार करने में सक्षम होना चाहिए।

+0

क्या आप इस उत्तर का विस्तार कर सकते हैं? तो आप सेवा में ब्रॉडकास्ट रिसीवर को लागू करते हैं और गतिविधि में कोई दूसरा? और दोनों तरफ से इरादे भेजा? साथ ही, क्या मैं BroadcastReceiver के बजाय LocalBroadcastReceiver का उपयोग कर सकता हूं? – Radu

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