गतिविधि संदर्भ और अनुप्रयोग संदर्भ के बीच अंतर


233

इसने मुझे स्टम्प किया है, मैं इसे एंड्रॉइड 2.1-आर 8 एसडीके में उपयोग कर रहा था:

ProgressDialog.show(getApplicationContext(), ....);

और में भी

Toast t = Toast.makeText(getApplicationContext(),....);

getApplicationContext()दोनों क्रैश का उपयोग कर .... ProgressDialogऔर Toastजो मुझे इस प्रश्न की ओर ले जाते हैं:

क्रिया प्रसंग को साझा करने के बावजूद, गतिविधि संदर्भ और अनुप्रयोग के संदर्भ में वास्तविक अंतर क्या है?


यह वही है जो मैंने stackoverflow.com/questions/1561803/… पर पाया है ...
t0mm13b

14
इससे कुछ चीजों को स्पष्ट करने में मदद मिलनी चाहिए: संदर्भ, क्या संदर्भ?
तोबस्को 42

जवाबों:


250

वे दोनों प्रसंग प्रसंग हैं , लेकिन अनुप्रयोग का उदाहरण अनुप्रयोग के जीवनचक्र से बंधा होता है, जबकि गतिविधि का उदाहरण किसी गतिविधि के जीवनचक्र से बंधा होता है। इस प्रकार, उनके पास आवेदन पर्यावरण के बारे में विभिन्न जानकारी तक पहुंच है।

यदि आप getApplicationContext पर डॉक्स पढ़ते हैं तो यह नोट करता है कि आपको इसका उपयोग केवल तभी करना चाहिए जब आपको ऐसे संदर्भ की आवश्यकता हो, जिसका जीवनचक्र वर्तमान संदर्भ से अलग हो। यह आपके किसी भी उदाहरण में लागू नहीं होता है।

गतिविधि के संदर्भ में संभवतः वर्तमान गतिविधि के बारे में कुछ जानकारी है जो उन कॉलों को पूरा करने के लिए आवश्यक है। यदि आप सटीक त्रुटि संदेश दिखाते हैं, तो यह इंगित करने में सक्षम हो सकता है कि वास्तव में इसकी क्या आवश्यकता है।

लेकिन सामान्य तौर पर, गतिविधि संदर्भ का उपयोग करें जब तक कि आपके पास एक अच्छा कारण न हो।


1
मुझे एक 'java.lang.reflect.InvocationTargetException' मिला, जिसका उपयोग करते समय getApplicationContext, दिलचस्प रूप से पर्याप्त, जब मैं बदल गया this, तो यह दुर्घटनाग्रस्त नहीं हुआ और उम्मीद के मुताबिक काम किया .... इसलिए यदि वे दोनों प्रसंग के उदाहरण हैं, तो कोई काम क्यों नहीं करता है और अन्य करता है इस जानकारी से मुझे आशा है कि दूसरों की मदद होगी ... :) आपके शीघ्र उत्तर के लिए धन्यवाद ...
t0mm13b

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

74
मैं कहूंगा कि ऐप के संदर्भ का उपयोग तब तक करें जब तक कि आपके पास अच्छा कारण न हो (यानी संवाद या टोस्ट के लिए)। अलग-अलग स्थितियों में गतिविधि संदर्भों का उपयोग करके मेमोरी लीक में दौड़ना काफी आसान है, इसलिए सुरक्षित होना सबसे अच्छा है :) android-developers.blogspot.com/2009/01//
डोरी

10
डेव स्मिथ ने संदर्भ के उपयोग को समझने के लिए एक बहुत अच्छी ब्लॉग प्रविष्टि पोस्ट की है, यहां देखें । सुनिश्चित करें कि आप टिप्पणियाँ भी पढ़ें!
ChrLipp

1
बात यह है, कि डायना हैकॉर्न भी गतिविधि संदर्भ का उपयोग करने की सलाह देते हैं। stackoverflow.com/questions/5228160/… लेकिन उसे लगता है कि वह खुद इस बारे में पूरी तरह सुनिश्चित नहीं है।
जैकसनऑफ 1

178

विभिन्न प्रकार के संदर्भों का उपयोग करने के निर्णय के लिए मुझे यह तालिका सुपर उपयोगी लगी:

यहां छवि विवरण दर्ज करें

  1. एक एप्लिकेशन यहां से एक गतिविधि शुरू कर सकता है, लेकिन इसके लिए आवश्यक है कि एक नया कार्य बनाया जाए। यह विशिष्ट उपयोग के मामलों में फिट हो सकता है, लेकिन आपके एप्लिकेशन में गैर-मानक बैक स्टैक व्यवहार बना सकता है और आमतौर पर अनुशंसित या अच्छा अभ्यास नहीं माना जाता है।
  2. यह कानूनी है, लेकिन मुद्रास्फीति उस सिस्टम के लिए डिफ़ॉल्ट थीम के साथ की जाएगी जिस पर आप चल रहे हैं, न कि आपके आवेदन में क्या परिभाषित किया गया है।
  3. यदि रिसीवर अशक्त है, जो कि एंड्रॉइड 4.2 और उसके बाद के संस्करण पर एक चिपचिपा प्रसारण के वर्तमान मूल्य को प्राप्त करने के लिए उपयोग किया जाता है।

मूल लेख यहाँ



संसाधनों को प्राप्त करने के बारे में क्या? मुझे लगता है कि आप बेहतर तरीके से इसे अपनी तालिका में जोड़ सकते हैं। और आप वाहवाही के संदर्भ में संसाधनों का उपयोग कर सकते हैं।
अमीर ज़ियारती 12

हम एप्लिकेशन संदर्भ से गतिविधि शुरू कर सकते हैं
दुए फान

लेख यहाँ भी पाया जा सकता है: wundermanthompsonmobile.com/2013/06/context
Lifes

34

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


25
पूरी तरह से सहमत हूँ। Google ने इस पर गेंद को गिरा दिया। यह पूरी तरह से गड़बड़ है।
सोरेन बोइसन

@ SørenBoisen android sdk एक पूर्ण गड़बड़ है
CommonSenseCode

वे गंदगी के बारे में जानते हैं, और मुझे यकीन है कि वे जितना संभव हो उतना ठीक करने के लिए संघर्ष कर रहे हैं।
पसिग्नचर

15

मुझे लगता है कि ProgressDialogऐसा लगता है कि यह गतिविधि से जुड़ी हुई है, ProgressDialogजो संवाद को नष्ट कर देती है, क्योंकि गतिविधि नष्ट होने के बाद नहीं रह सकती है, इसलिए इसे पारित करने की आवश्यकता है this(एक्टिविटी कोटेक्स्ट) जो गतिविधि के साथ नष्ट हो जाती है, जबकि एक्टिविटी होने के बाद भी एप्लिकेशनकनेक्ट पर बनी रहती है नष्ट किया हुआ।


3

GetApplicationContext () का उपयोग करें यदि आपको किसी ऐसे प्रसंग से बंधे होने की आवश्यकता है जिसमें स्वयं वैश्विक गुंजाइश होगी।

यदि आप गतिविधि का उपयोग करते हैं, तो नई गतिविधि उदाहरण में एक संदर्भ होगा, जिसमें पुरानी गतिविधि का एक अंतर्निहित संदर्भ होता है, और पुरानी गतिविधि को एकत्र नहीं किया जा सकता है।


2

मुझे लगता है कि जब सब कुछ दिखाने के लिए एक स्क्रीन की आवश्यकता होती है (बटन, संवाद, लेआउट ...) हमें संदर्भ गतिविधि का उपयोग करना होगा, और सब कुछ दिखाने के लिए स्क्रीन की आवश्यकता नहीं है या (टोस्ट, सेवा टेलीफ़ोन, संपर्क ...) हम एक अनुप्रयोग संदर्भ का उपयोग कर सकता है


1

जब आप अपने ऐप को होम स्क्रीन से सीधे लॉन्च करते हैं तो आप दो संदर्भों के बीच अंतर देख सकते हैं जब आपका ऐप किसी अन्य ऐप से साझा इरादे से लॉन्च किया जाता है।

यहाँ @CommonSenseCode द्वारा उल्लिखित "गैर-मानक बैक स्टैक व्यवहार" का व्यावहारिक उदाहरण दिया गया है:

मान लीजिए कि आपके पास दो ऐप हैं जो एक दूसरे के साथ संवाद करते हैं, App1 और App2

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

मान लीजिए कि अब आप App1 में हैं और App2 लॉन्च करें: एक साझा इरादे के साथ मुख्य गतिविधि (ACTION_SEND या ACTION_SEND_MULTIPLE)। फिर वहां से App2: सेकेंडरीएक्टिविटी (हमेशा सभी मानक लॉन्च मोड और आशय के झंडे के साथ) लॉन्च करने का प्रयास करें । क्या होता है:

  • यदि आप App2 लॉन्च करते हैं: Android <10 पर एप्लिकेशन संदर्भ के साथ माध्यमिकता आप एक ही कार्य में सभी गतिविधियों को लॉन्च नहीं कर सकते । मैंने एंड्रॉइड 7 और 8 के साथ प्रयास किया है और माध्यमिकता को हमेशा एक नए कार्य में लॉन्च किया जाता है (मुझे लगता है क्योंकि App2: द्वितीयक सक्रियता App2 अनुप्रयोग संदर्भ के साथ लॉन्च की गई है लेकिन आप App1 से आ रहे हैं और आपने सीधे App2 एप्लिकेशन लॉन्च नहीं किया है । शायद हुड एंड्रॉयड के तहत मान्यता है कि और FLAG_ACTIVITY_NEW_TASK का उपयोग करें)। यह आपकी जरूरतों के आधार पर अच्छा या बुरा हो सकता है, क्योंकि मेरा आवेदन खराब था।
    एंड्रॉइड 10 पर ऐप
    "गतिविधि के संदर्भ के बाहर से कॉलिंग स्टार्टअक्टिविटी () संदेश के साथ क्रैश हो जाता है, इसके लिए FLAG_ACTIVITY_NEW_TASK ध्वज की आवश्यकता होती है। क्या यह वास्तव में आप चाहते हैं?"
    इसलिए इसे एंड्रॉइड 10 पर काम करने के लिए आपको FALG_ACTIVITY_NEW_TASK का उपयोग करना होगा और आप एक ही कार्य में सभी गतिविधियों को नहीं चला सकते।
    जैसा कि आप देख सकते हैं कि व्यवहार एंड्रॉइड संस्करणों के बीच भिन्न है, अजीब है।

  • यदि आप App2 लॉन्च करते हैं: गतिविधि संदर्भ के साथ माध्यमिकता सभी अच्छी तरह से चलती है और आप एक ही कार्य में सभी गतिविधियों को एक रैखिक बैकस्टैक नेविगेशन के रूप में चला सकते हैं।

मुझे आशा है कि मैंने कुछ उपयोगी जानकारी जोड़ी है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.