2010-10-16 10 views
14

कहा जा रहा है, मेरे एंड्रॉइड एप्लिकेशन में, मैंने एप्लिकेशन क्लास को अधिभारित किया, और मैंने अपने मैनिफेस्ट में टैग अपडेट किया। यह एप्लिकेशन एक एंड्रॉइड सेवा भी बनाता है। मैंने अपने आवेदन वर्ग के ऑन-डेट में कुछ लॉग डाल दिए हैं, और मुझे लगता है कि इसे दो बार बुलाया जा रहा है। पहली बार जब मेरा एप्लिकेशन लॉन्च हो जाता है (यह अपेक्षित है) और फिर, सेवा के निर्माण के बाद आमतौर पर यह सही होता है। लॉग यह भी दिखाता है कि एप्लिकेशन का दूसरा उदाहरण बनाया जा रहा है। (मैं "यह" मान मुद्रित करता हूं और वे अलग हैं)।एंड्रॉइड एप्लिकेशन क्लास को दो बार

मैंने सोचा कि एप्लिकेशन को सिंगलटन के रूप में बनाया जाएगा। क्या ऐसा हो रहा है क्योंकि मैं सेवा बना रहा हूं?

उत्तर

1

समस्या यह है कि एक सेवा भी एक घटक है, अपने जीवन चक्र के साथ, बस इसे एक उपयोगकर्ता इंटरफ़ेस नहीं मिला है। विकल्पों के लिए आपको developer application fundamental एस जांचना चाहिए।

+0

ऐसा लगता है कि यह मुद्दा इस तथ्य से संबंधित हो सकता है कि मैंने एंड्रॉइड: प्रोसेस टैग का उपयोग करके मैनिफेस्ट में अपनी सेवा घोषित की। क्या यह समझ में आ सकता है? –

+0

हां। मैंने अभी सूचना के उसी स्रोत में जांच की है और यही वह है जिसे मैंने समझा। मैंने हालांकि परीक्षण नहीं किया था। –

+0

जानकारी का आपका स्रोत क्या है? मुझे यह जानकर उत्सुकता होगी कि इस मामले को कैसे संभाला जाए। सेवा को अपनी प्रक्रिया बनाने के लिए यह असामान्य नहीं है, और एप्लिकेशन क्लास को "सिंगलटन" माना जाता है जहां वैश्विक वस्तुओं को साझा किया जा सकता है। –

3

एक सेवा वास्तव में को गतिविधि के रूप में नहीं माना जाना चाहिए, और यदि आप इस तरह से सोचते हैं तो आपको बाद में समस्याएं होनी चाहिए। सेवाएं और गतिविधियां एक ही एप्लिकेशन से संबंधित हो सकती हैं, अगर आपने उन्हें AndroidManifest.xml में परिभाषित किया है, लेकिन वे अलग-अलग व्यवहार करते हैं और अलग-अलग जीवनशैली रखते हैं। यदि आप अपनी सेवा को एक अलग प्रक्रिया में चाहते हैं, तो <service> अनुभाग में android:process="string" सेट करें ताकि यह आपके एप्लिकेशन नाम से अलग नाम दे सके। जब आप एक अलग प्रक्रिया में हों तो वैश्विक चर तक पहुंच नहीं होगी, और आपको इरादों के माध्यम से अपनी सेवा में संवाद करना चाहिए। यदि आपकी सेवा अधिक जटिल है, तो आप इसे एआईडीएल के माध्यम से दूरस्थ रूप से कॉल करने योग्य बनाना चाहते हैं। यदि आप सिंगलटन गतिविधि चाहते हैं, तो उस गतिविधि का launchMode या तो singleInstance या singleTask पर सेट करें। singleInstance का अर्थ यह है कि यह इस कार्य का पहला और एकमात्र उदाहरण होगा, जो किसी भी नए इरादे के लिए बनाया जाएगा और कोई नया उदाहरण नहीं बनाया जाएगा। चूंकि यह इस गतिविधि का एकमात्र उदाहरण है, यह हमेशा कार्य स्टैक के शीर्ष पर होगा, और हमेशा इस गतिविधि में निर्देशित नए इरादों को संभालने की स्थिति में होगा। यदि गतिविधि को singleTask के रूप में घोषित किया गया है तो यह एक सिंगलटन भी होगा, लेकिन एक ही कार्य स्टैक में अन्य गतिविधियां हो सकती हैं, और इसके ऊपर कार्य स्टैक के शीर्ष पर गतिविधियां भी हो सकती हैं। यह ध्यान देने के लिए एक महत्वपूर्ण भेद है। इसे याद रखें: सिंगलटन गतिविधियां कार्य स्टैक के शीर्ष पर नहीं हैं नए इरादों को संभाल नहीं सकते हैं, और इरादा छोड़ दिया जाएगा। यदि आप चाहते हैं कि आपकी गतिविधि हमेशा इसके लिए निर्धारित सभी नए इरादों को संभालने में सक्षम हो, तो आप शायद singleInstance

+0

कार्य स्टैक को या तो स्क्रीन पर दिखाई देने वाली चीज़ों को भ्रमित न करें। मैं बस इसे स्पष्ट करना चाहता था। कार्य स्टैक के शीर्ष पर होने का मतलब यह नहीं है कि यह स्क्रीन पर दिखाई दे रहा है। तो एक सिंगलटन गतिविधि जो कि इसके कार्य स्टैक में एकमात्र गतिविधि है, जो किसी अन्य गतिविधि (एक अलग कार्य में) के पीछे पृष्ठभूमि में हो सकती है, अभी भी इरादे को संभालने में सक्षम है (और ऐसा करने में, अग्रभूमि में आ जाएगा) –

26

हां, यदि आपने एंड्रॉइड: प्रक्रिया का उपयोग किया है तो आप इसे एक अलग प्रक्रिया में चल रहे हैं, इसलिए सेवा शुरू होती है इसके लिए एक नई प्रक्रिया शुरू की जाती है और इस प्रकार उस प्रक्रिया के लिए एक नई एप्लिकेशन ऑब्जेक्ट की आवश्यकता होती है।

लेकिन एक और मौलिक समस्या है - एप्लिकेशन ऑब्जेक्ट के लिए अपनी सेवाओं में से कोई एक शुरू करना सही नहीं है। यह महत्वपूर्ण है कि आप एप्लिकेशन को भ्रमित न करें कि आप किसी अन्य ओएस में "एप्लिकेशन" के बारे में क्या सोच सकते हैं। एप्लिकेशन ऑब्जेक्ट ऐप ड्राइव नहीं करता है। यह उस प्रक्रिया में ऐप के लिए सिर्फ एक वैश्विक स्थिति है। वास्तव में, एप्लिकेशन ऑब्जेक्ट पूरी तरह से अनावश्यक है - आप कभी को एंड्रॉइड एप्लिकेशन लिखने की आवश्यकता नहीं है। आम तौर पर मैं वास्तव में अनुशंसा करता हूं कि लोग इसका उपयोग न करें। किसी और चीज की तुलना में परेशानी पैदा करने की संभावना अधिक है।

इसे रखने का एक और तरीका: वास्तव में किसी एप्लिकेशन को परिभाषित करने से गतिविधि, सेवा, रिसीवर और प्रदाता टैग का संग्रह होता है। वे "लॉन्च" हैं। सभी आवेदन एक ऐसा है जो किसी एप्लिकेशन की प्रक्रिया को प्रारंभ करने के हिस्से के रूप में बनाया गया है। इसका कोई जीवन चक्र नहीं है, यह ऐप में अन्य वास्तविक घटकों की सेवा करने के लिए है।

तो अपने ऐप को डिज़ाइन करते समय एप्लिकेशन को अनदेखा करें; यह भ्रम को कम करेगा। (इसके स्थान पर, मैं इस तरह के राज्य के लिए वैश्विक सिंगलेट का उपयोग करना पसंद करता हूं।)

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

+1

+1 जानकारीपूर्ण। –

+0

+1, हालांकि मुझे आश्चर्य है कि MyApplication.onCreate() से बेहतर विकल्प है, जब प्रति प्रक्रिया एक बार प्रारंभिक आवश्यकता होती है। उदाहरण के लिए, मैं बिना किसी अपवाद के लिए एक हैंडलर को विश्वसनीय रूप से पंजीकृत करूंगा? ऑनक्रेट() काम करता है जब मेरे पास गतिविधियों के साथ-साथ एक सेवा भी होती है। – orip

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