2010-06-29 15 views
10

मैं एक एंड्रॉइड ऐप को दोबारा डिजाइन/रीडिज़ाइन करने की कोशिश कर रहा हूं। वर्तमान में, मेरे पास एक यूआई गतिविधि है (Activity 1) जो DataThread बनाता है। यह थ्रेड नेटवर्क I/O के लिए ज़िम्मेदार है और handler के माध्यम से UI गतिविधि के साथ इंटरैक्ट (डेटा प्रदान करता है)।एंड्रॉइड सेवा कई गतिविधियों के साथ इंटरैक्टिंग

अब, मैं एक और गतिविधि (वीडियो के साथ एक नई यूआई स्क्रीन) जोड़ना चाहता हूं - Activity 2Activity 1 अभी भी मुख्य गतिविधि है। Activity 2 तब लागू किया जाएगा जब उपयोगकर्ता Activity 1 पर एक बटन क्लिक करता है। Activity 2 का डेटा भी DataThread से आता है।

मेरा विचार एंड्रॉइड Service (DataService) के अंदर मेरे DataThread का तर्क डालना है। मेरा सवाल है - एक ही समय में पर गतिविधि बाइंड से अधिक हो सकता है? क्या किसी विशिष्ट गतिविधि को डेटा प्रदान करने के लिए सेवा बताने का कोई तरीका है?

कोई अन्य विचार स्वागत है?

अग्रिम धन्यवाद।

उत्तर

4

मैं आमतौर पर एप्लिकेशन क्लास से अपनी सेवा को बांधता हूं और कुछ प्रकार के नियंत्रक वर्ग (जैसे "मध्यस्थ" मुझे लगता है ... सुनिश्चित नहीं है कि इन सभी पैटर्न का नाम कैसे रखा गया है) उन अनुप्रयोगों में शामिल है जो सेवाओं के बीच संचार को संभालती हैं और जो भी सक्रिय गतिविधि है।

इसमें आपकी खुद की एप्लिकेशन क्लास लिखना और इस का उपयोग करने के लिए मेनिफेस्ट को शामिल करना शामिल होगा। मैं पिछले एक धागे में इस प्रक्रिया पर और अधिक विस्तार में चला गया:

More efficient way of updating UI from Service than intents?

आप (onResume में खुद के लिए आवेदन वर्ग एक संदर्भ भेजने भी उदाहरण से समझाया द्वारा "वर्तमान में सक्रिय" गतिविधि पर नज़र रख सकता है ऊपर)। यह आपकी गतिविधियों को एक सामान्य बेस क्लास से प्राप्त करके पूरा किया जा सकता है जिसमें आपके एप्लिकेशन क्लास (getAplicationContext से कास्टिंग) प्राप्त करने का एक तरीका है, और इस बेस क्लास 'ऑनस्यूम में, एप्लिकेशन को स्वयं का एक रेफरी भेजें। फिर, आप अपने डेटा सेवा कंट्रोलर के साथ नाम से गतिविधियों को पंजीकृत कर सकते हैं, उदाहरण के लिए, और केवल वर्तमान गतिविधि को संदेश भेजें, अगर यह उन्हें प्राप्त करने के लिए नियंत्रक के साथ पंजीकृत है।

+0

मैं इस तरह के समाधान की तलाश में हूं, क्या इस कार्यान्वयन के बारे में अधिक जानकारी प्राप्त करने के लिए कोई कामकाजी उदाहरण या लिंक है, thx – Sam

+7

@Rich यदि आप इसे बाध्य करते हैं तो आपका एप्लिकेशन समाप्त होने पर सेवा से स्पष्ट रूप से अनबाइंड कैसे प्रबंधित होता है आपके आवेदन वर्ग में? चूंकि एप्लीकेशन # ऑन टर्मिनेट() को कभी भी उत्पादन उपकरणों पर नहीं कहा जाता है, तो जावाडॉक http://developer.android.com/reference/android/app/Application.html –

+0

@SvenJacobs एकमात्र तरीका है जिसके बारे में मैं सोच सकता हूं: सेवा कॉल को ' रोकें() 'कुछ समय बाद जब सभी गतिविधियां रोक दी जाती हैं। क्रियाकलापों को इस मामले में सेवा को अपने मामले में बताना होगा जब वे रुक रहे हैं। गतिविधियां कभी भी 'unbindService() 'को कॉल नहीं करतीं और सेवा प्रत्येक गतिविधि के प्रत्येक ऑन्यूज़() पर' applicationContext' से जुड़ी होती है। – OneWorld

6

निश्चित रूप से एक से अधिक गतिविधि आपकी सेवा से जुड़ सकती हैं। आपको बाध्य करने वाले प्रत्येक के लिए एक ऑनबिंड() मिलेगा। आपकी सेवा तब आपकी सेवा में ऑनबिंड() से आईडी या इरादे (प्रत्येक गतिविधि के लिए अपनी गतिविधियों के साथ) के माध्यम से पहचान कर उन्हें पहचानकर कई गतिविधियों के साथ बातचीत करने के तर्क को संभालेगी। इसके बाद आप उस सेवा से जुड़ी प्रत्येक गतिविधि के लिए पृष्ठभूमि थ्रेड से सेवा को दूर कर सकते हैं।

+3

@ जोकिमइंजस्ट्रॉम तो आपने इसे क्यों संपादित नहीं किया है, इसलिए यह अधिक स्पष्ट है? – SMT

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