2012-12-26 39 views
6

क्या सामग्री प्रदाताओं के रूप में सेवाओं के साथ बातचीत करने के कुछ तरीके हैं?सेवाओं के साथ बातचीत करने के लिए सरल तरीके?

मेरा मतलब है, उदाहरण के लिए सामग्री प्रदाताओं के साथ हमारे पास getContentResolver() है: यदि आपके पास Context है तो डेटा से पूछना आसान है। आपको क्रॉस-प्रोसेस कॉल (ContentProvider) के ब्योरे के बारे में भी चिंता करने की ज़रूरत नहीं है।

सेवाओं के साथ, आपको उन्हें बांधना होगा, कनेक्शन स्थापित होने की प्रतीक्षा करें, फिर अगर आप स्मृति को रिसाव नहीं करना चाहते हैं तो उन्हें बाध्य करना सुनिश्चित करें। इससे भी बदतर, आपको दूरस्थ सेवाओं के लिए AIDL से निपटना होगा।

इस उदाहरण ले रहा है:

मैं एक फ़ाइल डाउनलोडर मॉड्यूल है। वर्तमान में दो दृष्टिकोण हैं: सामग्री प्रदाता या सेवा। प्रत्येक नए डाउनलोड को शुरू करने के लिए, यह दोनों के लिए आसान है:

  • सेवा: startService()। आपको बस एक संदर्भ की आवश्यकता है।
  • सामग्री प्रदाता: getContentResolver() और अपनी कतार में नया डाउनलोड डालें। आपको बस एक संदर्भ की आवश्यकता है।

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

मैं इस प्रश्न से पूछ रहा हूं क्योंकि उपर्युक्त उदाहरण के साथ, एक सेवा सही है कम से कम इसके नाम के कारण, एक सामग्री प्रदाता पर दृष्टिकोण।

धन्यवाद,

+0

"औसत गति", "प्रतिशत पूर्ण" जानकारी के साथ आप क्या करने जा रहे हैं? – Squonk

+0

@Squonk मैं यूआई में उन्हें यूजर में दिखाना चाहता हूं यदि उपयोगकर्ता जानना चाहता है। –

उत्तर

4

दो तरीके मैं यह करने के सुझाव है ...

पहले ResultReceiver जो Parcelable लागू करता है का उपयोग कर प्रयास करें।

मूल रूप से अपने स्वयं के वर्ग जो फैली ResultReceiver तो एक Intent जो आप अपने Activity से startService(Intent intent) में पारित पर putExtra(String name, Parceable value फोन पैदा करते हैं। Service फिर डेटा भेजने के लिए ResultReceiver पर send(int resultCode, Bundle resultData) का उपयोग कर सकते हैं। यदि ResultReceiver आपके Activity का एक आंतरिक वर्ग है तो यह इसके यूआई के साथ बातचीत करने में सक्षम होगा।

दूसरी संभावना Notifications का उपयोग FLAG_ONGOING_EVENT ध्वज का उपयोग करना है। यह स्पष्ट रूप से Activity में दिखाई नहीं देगा, लेकिन Notification बार में दिखाई देगा लेकिन आप एक अद्यतन RemoteView को एक अपडेट और अपडेट टेक्स्ट आदि के साथ प्रत्येक अद्यतन अधिसूचना के साथ बना सकते हैं। यह तब होता है जब आप Google Play को अपने डिवाइस पर ऐप इंस्टॉल या अपडेट करते समय देखते हैं।

+0

कमाल का जवाब। बहुत बहुत धन्यवाद। आपने मुझे 'परिणाम रिसीवर' के साथ एक दिन बचाया, खासकर यह एपीआई 3+ में उपलब्ध है। धन्यवाद :-) –

+1

मदद करने में खुशी हुई। मैं 'सेवा' और 'गतिविधि' के बीच संवाद करने के लिए खुद को 'परिणाम रिसीवर' का उपयोग करता हूं। यह काफी अच्छी तरह से काम करता है। – Squonk

+1

@LaiVung: डाउनलोड के लिए भी 'IntentService' देखें - यह अपना स्वयं का कार्यकर्ता धागा बनाता है और अपना काम पूरा करने के बाद स्वयं समाप्त हो जाएगा। देखें - http://developer.android.com/reference/android/app/IntentService.html – Squonk