GetContext (), getApplicationContext (), getBaseContext () और "दिस" के बीच अंतर


565

बीच क्या अंतर है getContext(), getApplicationContext(), getBaseContext(), और " this"?

हालांकि यह सरल प्रश्न है, मैं उनके बीच बुनियादी अंतर को समझने में असमर्थ हूं। यदि संभव हो तो कृपया कुछ आसान उदाहरण दें।


1
पहले उत्तर में एक उत्कृष्ट लेखन है: stackoverflow.com/questions/1026973/…
ky1enamic

जवाबों:


528
  • View.getContext(): उस दृश्य को लौटाता है जो दृश्य वर्तमान में चल रहा है। आमतौर पर वर्तमान में सक्रिय गतिविधि।

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

  • ContextWrapper.getBaseContext(): यदि आपको किसी अन्य संदर्भ में किसी संदर्भ से अभिगम की आवश्यकता है, तो आप एक प्रसंग का उपयोग करते हैं। प्रसंग अंदर से संदर्भित है कि ContextWrapper getBaseContext () के माध्यम से पहुँचा है।


59
और "इस" के बारे में क्या?
CooL i3oY

16
+ CooL i3oY getContext के साथ समान
मिकी

13
वास्तव में मुझे भ्रम है कि संदर्भ का उचित बचाव क्या है ??
रवि

11
"यह" और getContext () दोनों समान हैं
KCRaju

43
thisऔर getContext()हमेशा एक्टिविटी क्लास में समान नहीं होते हैं, आप उपयोग कर सकते हैं thisक्योंकि Activityइनहेरिट की जाती है Contextलेकिन विधि कक्षा getContext()में नहीं है Activity। @mikedroid @KCRaju
नंदन

92

अधिकांश जवाब पहले से ही कवर getContext()और getApplicationContext()लेकिन getBaseContext () शायद ही कभी समझाया गया है।

विधि getBaseContext()केवल तब प्रासंगिक होती है जब आपके पास ए ContextWrapper। एंड्रॉइड एक ContextWrapperवर्ग प्रदान करता है जो मौजूदा Contextउपयोग के आसपास बनाया गया है :

ContextWrapper wrapper = new ContextWrapper(context);

एक का उपयोग करने का लाभ ContextWrapperयह है कि यह आपको "मूल संदर्भ को बदलने के बिना व्यवहार को संशोधित करने देता है"। उदाहरण के लिए, यदि आपके पास एक गतिविधि है, myActivityतो Viewएक अलग विषय के साथ बना सकते हैं myActivity:

ContextWrapper customTheme = new ContextWrapper(myActivity) {
  @Override
  public Resources.Theme getTheme() { 
    return someTheme;
  }
}
View myView = new MyView(customTheme);

ContextWrapperक्योंकि यह आपके द्वारा प्रदान की अधिकांश कार्यों को ओवरराइड करने देता है वास्तव में शक्तिशाली है Contextउन संसाधनों तक पहुंच के लिए कोड सहित (जैसे openFileInput(), getString()), अन्य घटकों के साथ सहभागिता (जैसे sendBroadcast(), registerReceiver()), अनुरोध अनुमतियों (जैसे checkCallingOrSelfPermission()) और हल करने फाइल सिस्टम स्थानों (जैसे getFilesDir())। ContextWrapperडिवाइस / संस्करण विशिष्ट समस्याओं के आसपास काम करने या घटकों के लिए एक-बंद अनुकूलन लागू करने के लिए वास्तव में उपयोगी है जैसे कि दृश्य के लिए एक संदर्भ की आवश्यकता होती है।

विधि getBaseContext () का उपयोग "आधार" संदर्भ तक पहुंचने के लिए किया जा सकता है जो ContextWrapperचारों ओर लपेटता है। यदि आपको उदाहरण के लिए, "आधार" संदर्भ का उपयोग करने की आवश्यकता हो सकती है, तो जांचें कि क्या यह एक है Service, Activityया Application:

public class CustomToast {
  public void makeText(Context context, int resId, int duration) {
    while (context instanceof ContextWrapper) {
      context = context.baseContext();
    }
    if (context instanceof Service)) {
      throw new RuntimeException("Cannot call this from a service");
    }
    ...
  }
}

या यदि आपको किसी विधि का "अनट्रैप्ड" संस्करण कॉल करने की आवश्यकता है:

class MyCustomWrapper extends ContextWrapper {
  @Override
  public Drawable getWallpaper() {
    if (BuildInfo.DEBUG) {
      return mDebugBackground;
    } else {
      return getBaseContext().getWallpaper();
    }
  }
}

17
मैं कहूंगा, यह एक स्वीकार किए जाने के बाद सबसे महत्वपूर्ण जवाब है।
०१

4
मैं कहूंगा कि ContextWrapperAndroid ढांचे के डेवलपर्स द्वारा किए गए सबसे खराब फैसलों में से एक है। जब उन्होंने महसूस किया कि उन्होंने सही काम करने और कोड को सिंगल रिस्पॉन्सिबिलिटी की ओर फिर से करने के बजाय, देव वस्तुओं का एक पूरा परिवार बनाया है, तो उन्होंने एक बदसूरत हैक को जोड़ा जो वंशानुक्रम के पेड़ को गहरा करके प्रसंग व्यवहार को बदलने की अनुमति देता है। अपने सबसे खराब सॉफ्टवेयर इंजीनियरिंग खराब है। हमारे लिए, डेवलपर्स, IMHO किसी को भी कभी भी उपयोग getBaseContext()या नहीं करना चाहिए ContextWrapper। यदि आप करते हैं - यह एक विशाल "कोड गंध" है।
वसीली

मुझे पूरा CustomToastकोड देखना है । THANKS
अल्स्टन

39

getApplicationContext () - एप्लिकेशन में चल रही सभी गतिविधियों के लिए संदर्भ देता है।

getBaseContext () - यदि आप एप्लिकेशन के भीतर किसी अन्य संदर्भ से प्रसंग को एक्सेस करना चाहते हैं तो आप एक्सेस कर सकते हैं।

getContext () - केवल वर्तमान में चल रही गतिविधि को संदर्भ दृश्य देता है।


1
Pls ए और बी को संदर्भ के संदर्भ में अपनी परिभाषा में पत्र ए और बी शामिल करें, यह किसी भी उत्तर में स्पष्ट नहीं है कि कौन सा संदर्भ एक्सेस किया गया है।
उम्मीद है कि

29

एंड्रॉइड ब्रह्मांड में सबसे कठिन सवालों में से एक "क्या संदर्भ है" सवाल है।

संदर्भ उन तरीकों को परिभाषित करता है जो सिस्टम संसाधनों तक पहुंचते हैं, आवेदन की स्थिर संपत्ति को पुनः प्राप्त करते हैं, अनुमतियों की जांच करते हैं, यूआई जोड़तोड़ करते हैं और कई और अधिक। संक्षेप में, Contextउत्पादन में ईश्वर वस्तु विरोधी पैटर्न का एक उदाहरण है।

जब यह बात आती है कि Contextहमें किस तरह का उपयोग करना चाहिए, तो यह बहुत जटिल हो जाता है क्योंकि गॉड ऑब्जेक्ट होने के अलावा, Contextउपवर्गों का पदानुक्रम वृक्ष लिस्कोव प्रतिस्थापन सिद्धांत का क्रूरतापूर्वक उल्लंघन करता है।

यह ब्लॉग पोस्टContext विभिन्न स्थितियों में वर्गों की प्रयोज्यता को संक्षेप में प्रस्तुत करने का प्रयास करता है।

मुझे उस पोस्ट से मुख्य तालिका को पूर्णता के लिए कॉपी करें:

+----------------------------+-------------+----------+---------+-----------------+-------------------+
|                            | Application | Activity | Service | ContentProvider | BroadcastReceiver |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| Show a Dialog              | NO          | YES      | NO      | NO              | NO                |
| Start an Activity          | NO¹         | YES      | NO¹     | NO¹             | NO¹               |
| Layout Inflation           | NO²         | YES      | NO²     | NO²             | NO²               |
| Start a Service            | YES         | YES      | YES     | YES             | YES               |
| Bind to a Service          | YES         | YES      | YES     | YES             | NO                |
| Send a Broadcast           | YES         | YES      | YES     | YES             | YES               |
| Register BroadcastReceiver | YES         | YES      | YES     | YES             | NO³               |
| Load Resource Values       | YES         | YES      | YES     | YES             | YES               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  1. एक एप्लिकेशन यहां से एक गतिविधि शुरू कर सकता है, लेकिन इसके लिए आवश्यक है कि एक नया कार्य बनाया जाए। यह विशिष्ट उपयोग के मामलों में फिट हो सकता है, लेकिन आपके आवेदन में गैर-मानक बैक स्टैक व्यवहार बना सकता है और आमतौर पर अनुशंसित या अच्छा अभ्यास नहीं माना जाता है।
  2. यह कानूनी है, लेकिन मुद्रास्फीति उस सिस्टम के लिए डिफ़ॉल्ट थीम के साथ की जाएगी जिस पर आप चल रहे हैं, न कि आपके आवेदन में क्या परिभाषित किया गया है।
  3. यदि रिसीवर अशक्त है, जो कि एंड्रॉइड 4.2 और उसके बाद के संस्करण पर एक चिपचिपा प्रसारण के वर्तमान मूल्य को प्राप्त करने के लिए उपयोग किया जाता है।

स्क्रीनशॉट


महान ब्लॉग पोस्ट है कि आप से जुड़े!
lejonl

28

ContextActvityया Applicationनए बनाए गए घटकों के बारे में जानकारी प्रदान करता है ।

Contextनव निर्मित घटकों को प्रासंगिकता प्रदान की जानी चाहिए (चाहे आवेदन संदर्भ या गतिविधि संदर्भ)

चूंकि Activityएक उपवर्ग है Context, इसलिए thisउस गतिविधि के संदर्भ को प्राप्त करने के लिए व्यक्ति इसका उपयोग कर सकता है


BaseContext के बारे में आपकी व्याख्या कहाँ है?
इगोरगानापोलस्की

1

इस डॉक्स से

मैं समझ गया कि आपको उपयोग करना चाहिए:

संदर्भ-गतिविधि के बजाय संदर्भ-अनुप्रयोग का उपयोग करने का प्रयास करें


0

getApplicationContext ()

इसका उपयोग एप्लिकेशन स्तर के लिए किया जाता है और सभी गतिविधियों को संदर्भित करता है।

getContext () और getBaseContext ()

सबसे शायद एक ही है। यह केवल वर्तमान गतिविधि है जो लाइव है।

इस

हमेशा वर्तमान क्लास ऑब्जेक्ट को संदर्भित करता है।


0

Contextहै:

  • एक अमूर्त वर्ग जिसका कार्यान्वयन एंड्रॉइड सिस्टम द्वारा प्रदान किया गया है।
  • यह एप्लिकेशन-विशिष्ट संसाधनों और कक्षाओं तक पहुंच के साथ-साथ एप्लिकेशन-स्तर के संचालन जैसे कि लॉन्चिंग गतिविधियों, प्रसारण और इंटेंस प्राप्त करने आदि के लिए कॉल-अप की अनुमति देता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.