अंतर और कब getApplication (), getApplicationContext (), getBaseContext () और someClass.this का उपयोग करें


121

मैं Android के लिए नया हूँ और मैं के बीच अंतर को समझने के लिए कोशिश कर रहा हूँ getApplication(), getApplicationContext(), getBaseContext(), getContext()और someClass.thisविशेष रूप से जब निम्नलिखित कोड लाइनों में इन तरीकों का उपयोग करने और:

जब मैं एक टोस्ट लॉन्च करता हूं तो इन और उन मामलों में क्या अंतर है, जिनका मैं उपयोग करता हूं?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

इरादों के साथ ही:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);

के संभावित डुप्लिकेट stackoverflow.com/q/1026973/741249 या stackoverflow.com/q/6854265/741249
THelper

वे केवल संदर्भ और आधार संदर्भ को संभालते हैं। लेकिन मैं 2 संदर्भों में उनके सभी उपयोगों को समझना चाहूंगा। धन्यवाद
फीनिक्स

जवाबों:


215

टोस्ट और आशय , दोनों को संदर्भ के संदर्भ की आवश्यकता है । और getApplication , getApplicationContext , LoginActivity.this और getBaseContext , ये सभी संदर्भ के संदर्भ प्रदान करते हैं।

अब बात भ्रमित करती है विभिन्न संदर्भों की घोषणा और उनके विशिष्ट-उपयोग की। चीजों को सरल बनाने के लिए, आपको एंड्रॉइड फ्रेमवर्क में उपलब्ध दो प्रकार के संदर्भों को गिनना चाहिए।

  1. आवेदन प्रसंग
  2. गतिविधि संदर्भ

एप्लिकेशन का संदर्भ एप्लिकेशन के जीवन-चक्र से जुड़ा हुआ है और आवेदन के पूरे जीवन में हमेशा समान रहेगा। इसलिए यदि आप टोस्ट का उपयोग कर रहे हैं , तो आप एप्लिकेशन संदर्भ या यहां तक ​​कि गतिविधि संदर्भ (दोनों) का उपयोग कर सकते हैं क्योंकि एक टोस्ट आपके आवेदन में कहीं से भी उठाया जा सकता है और एक खिड़की से जुड़ा नहीं है।

गतिविधि का संदर्भ गतिविधि के जीवन-चक्र से जुड़ा होता है और गतिविधि के बढ़ने पर इसे नष्ट किया जा सकता onDestroy()है। यदि आप एक नई गतिविधि लॉन्च करना चाहते हैं, तो आपको इसके इरादे में गतिविधि के संदर्भ का उपयोग करना होगा ताकि नई लॉन्चिंग गतिविधि वर्तमान गतिविधि (गतिविधि स्टैक के संदर्भ में) से जुड़ी हो। हालाँकि, आप एक नई गतिविधि शुरू करने के लिए एप्लिकेशन के संदर्भ का भी उपयोग कर सकते हैं, लेकिन फिर आपको Intent.FLAG_ACTIVITY_NEW_TASKइसे एक नए कार्य के रूप में मानने के लिए ध्वज सेट करने की आवश्यकता है ।

अब अपने मामलों की चर्चा करते हुए:

LoginActivity.this यद्यपि इसका संदर्भ आपकी अपनी कक्षा से है, जो गतिविधि वर्ग का विस्तार करती है, लेकिन आधार वर्ग (गतिविधि) भी प्रसंग वर्ग का विस्तार करता है, इसलिए इसका उपयोग गतिविधि संदर्भ प्रस्तुत करने के लिए किया जा सकता है।

getApplication() यद्यपि इसका संदर्भ अनुप्रयोग वस्तु पर है, लेकिन अनुप्रयोग वर्ग प्रसंग वर्ग का विस्तार करता है, इसलिए इसका उपयोग अनुप्रयोग संदर्भ प्रस्तुत करने के लिए किया जा सकता है।

getApplicationContext() आवेदन संदर्भ प्रदान करता है।

getBaseContext() गतिविधि संदर्भ प्रदान करता है।

टिप्स: जब भी आपको हेरफेर करने की आवश्यकता होती है Viewsतो एक्टिविटी-कॉन्टेक्ट के लिए जाएं , अन्यथा एप्लिकेशन-कॉनटेक्स्ट पर्याप्त होगा।


11
इसलिए अगर मुझे यह सही लगता है, someClass.this, getBaseContext और getContext () एक्टिविटी कॉन्टेक्स हैं जबकि getApplicationContext () और getApplication () एप्लीकेशन कॉन्टेक्स हैं?
फेनीक्स 7

संदर्भ सिर्फ एक पर्यावरण के बारे में सही जानकारी है?
committedandroider

हां, इसके सैंडबॉक्स की तरह जो एप्लिकेशन को होस्ट करता है
वकासलाम

@committedandroider क्योंकि गतिविधि संदर्भ में चुने हुए विषय के लिए अतिरिक्त जानकारी होती है, इसलिए जब कोड में विचार बनाए जाते हैं तो सही विषय स्वचालित रूप से लागू किया जाएगा। अधिक जानकारी के लिए, आप पढ़ सकते हैं इस
waqaslam

@ sqklam android sdk Classes का जिक्र, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; और getBaseContext()की विधि है ContextWrapper, getBaseContext() offers activity context.साथ ही साथ Application Context... यह भी नहीं है?
भूरू

26

वकास द्वारा जवाब बहुत स्पष्ट और पूर्ण है, हालांकि मैं thisबनाम getBaseContext(), या getApplication()बनाम का उपयोग करने के बीच के अंतर को और स्पष्ट करना चाहूंगा getApplicationContext()। दोनों Activityऔर खुद ही Applicationनहीं Context, बल्कि ContextWrapper, जो एक है

"उस के कार्यान्वयन को Contextबस इसके कॉल को दूसरे में दर्शाता है Context"।

वह "वास्तविक" संदर्भ वह है जिसे आप उपयोग करके प्राप्त करते हैं getBaseContext()

इसलिए यद्यपि this(के लिए Activity) और getBaseContext()दोनों गतिविधि संदर्भ देते हैं, वे

  • (ए) एक ही वस्तु ( this != getBaseContext()) और से संबंधित नहीं है
  • (बी) के माध्यम से कॉलिंग संदर्भ thisथोड़ा कम कुशल है, क्योंकि कॉल अप्रत्यक्ष स्तर के अतिरिक्त स्तर से गुजरते हैं। मुझे संदेह है कि यह कोई भी व्यावहारिक अंतर बनाता है, हालांकि।

एक ही तर्क getApplication()बनाम पर लागू होता है getApplicationContext()


जहां तक getBaseContext()बात है, Google के Android डेवलपर्स ने यह सुझाव दिया: "getBaseContext () का उपयोग न करें, बस आपके पास जो संदर्भ है उसका उपयोग करें।" इसलिए, वास्तव में, वे आपको thisगतिविधियों के लिए उपयोग करने का सुझाव देते हैं ।
चुंगपाम

यह getBaseContextइंटरनेट पर मुझे मिली सबसे स्पष्ट व्याख्या है । धन्यवाद!!
q126y

6
LoginActivity.this 

उपरोक्त पंक्ति एक ऐसी गतिविधि है, जो कि एक प्रसंग है। इसका उपयोग तब किया जाता है जब आप कुछ अलर्टडायॉगॉग बनाते हैं ... कुछ स्थानों पर इसकी अनिवार्यता है कि आप गतिविधि संदर्भ का उपयोग करें ...

getApplication()

यहाँ एक ही पाठ विधि बनाने की जरूरत है प्रसंग और अनुप्रयोग खुद को लागू करता है Context

getApplicationContext()

यह सबसे पसंदीदा तरीका है क्योंकि यह Contextअनफिट रहता है आवेदन शट डाउन हो जाता है।

getBaseContext()

यह संदर्भ विगेट्स और दृश्यों के लिए उपलब्ध है।

लेकिन वे सभी एक संदर्भ वस्तु देते हैं और कुछ नहीं ..


एक टोस्ट संदेश में या एक इरादा बनाते समय, वे सभी समान प्रभाव का उपयोग कर रहे हैं getApplicationContext () का उपयोग करना सबसे सही है?
फियोनिक्स 7

1
@ हसन सामी: टोस्ट के लिए, आप getApplicationContext()सभी स्थिति के लिए उपयोग कर सकते हैं , लेकिन यह बेहतर है कि आप thisकिसी गतिविधि में टोस्ट बनाते समय उपयोग करें ।
चुंगपाम

0

Class.this का उपयोग किया जाता है यदि आपकी कक्षा गतिविधि getapplication () का उपयोग करती है, तो संदर्भ एप्लिकेशन का उपयोग किया जाता है और एप्लिकेशन अनुप्रयोग संदर्भ getbasecontext का उपयोग करता है () अपनी गतिविधि के संदर्भ का संदर्भ लें अपनी गतिविधि का संदर्भ लें जीवन चक्र संदर्भ Applicationcontext आपके एप्लिकेशन जीवन चक्र का संदर्भ देता है

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