बीच क्या अंतर है getContext()
, getApplicationContext()
, getBaseContext()
, और " this
"?
हालांकि यह सरल प्रश्न है, मैं उनके बीच बुनियादी अंतर को समझने में असमर्थ हूं। यदि संभव हो तो कृपया कुछ आसान उदाहरण दें।
बीच क्या अंतर है getContext()
, getApplicationContext()
, getBaseContext()
, और " this
"?
हालांकि यह सरल प्रश्न है, मैं उनके बीच बुनियादी अंतर को समझने में असमर्थ हूं। यदि संभव हो तो कृपया कुछ आसान उदाहरण दें।
जवाबों:
View.getContext()
: उस दृश्य को लौटाता है जो दृश्य वर्तमान में चल रहा है। आमतौर पर वर्तमान में सक्रिय गतिविधि।
Activity.getApplicationContext()
: पूरे आवेदन के लिए संदर्भ देता है (प्रक्रिया सभी गतिविधियाँ अंदर चल रही हैं)। वर्तमान गतिविधि संदर्भ के बजाय इसका उपयोग करें यदि आपको संपूर्ण अनुप्रयोग के जीवनचक्र से बंधे संदर्भ की आवश्यकता है, न कि केवल वर्तमान गतिविधि की।
ContextWrapper.getBaseContext()
: यदि आपको किसी अन्य संदर्भ में किसी संदर्भ से अभिगम की आवश्यकता है, तो आप एक प्रसंग का उपयोग करते हैं। प्रसंग अंदर से संदर्भित है कि ContextWrapper getBaseContext () के माध्यम से पहुँचा है।
this
और getContext()
हमेशा एक्टिविटी क्लास में समान नहीं होते हैं, आप उपयोग कर सकते हैं this
क्योंकि Activity
इनहेरिट की जाती है Context
लेकिन विधि कक्षा getContext()
में नहीं है Activity
। @mikedroid @KCRaju
अधिकांश जवाब पहले से ही कवर 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();
}
}
}
ContextWrapper
Android ढांचे के डेवलपर्स द्वारा किए गए सबसे खराब फैसलों में से एक है। जब उन्होंने महसूस किया कि उन्होंने सही काम करने और कोड को सिंगल रिस्पॉन्सिबिलिटी की ओर फिर से करने के बजाय, देव वस्तुओं का एक पूरा परिवार बनाया है, तो उन्होंने एक बदसूरत हैक को जोड़ा जो वंशानुक्रम के पेड़ को गहरा करके प्रसंग व्यवहार को बदलने की अनुमति देता है। अपने सबसे खराब सॉफ्टवेयर इंजीनियरिंग खराब है। हमारे लिए, डेवलपर्स, IMHO किसी को भी कभी भी उपयोग getBaseContext()
या नहीं करना चाहिए ContextWrapper
। यदि आप करते हैं - यह एक विशाल "कोड गंध" है।
CustomToast
कोड देखना है । THANKS
getApplicationContext () - एप्लिकेशन में चल रही सभी गतिविधियों के लिए संदर्भ देता है।
getBaseContext () - यदि आप एप्लिकेशन के भीतर किसी अन्य संदर्भ से प्रसंग को एक्सेस करना चाहते हैं तो आप एक्सेस कर सकते हैं।
getContext () - केवल वर्तमान में चल रही गतिविधि को संदर्भ दृश्य देता है।
एंड्रॉइड ब्रह्मांड में सबसे कठिन सवालों में से एक "क्या संदर्भ है" सवाल है।
संदर्भ उन तरीकों को परिभाषित करता है जो सिस्टम संसाधनों तक पहुंचते हैं, आवेदन की स्थिर संपत्ति को पुनः प्राप्त करते हैं, अनुमतियों की जांच करते हैं, यूआई जोड़तोड़ करते हैं और कई और अधिक। संक्षेप में, 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 | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- एक एप्लिकेशन यहां से एक गतिविधि शुरू कर सकता है, लेकिन इसके लिए आवश्यक है कि एक नया कार्य बनाया जाए। यह विशिष्ट उपयोग के मामलों में फिट हो सकता है, लेकिन आपके आवेदन में गैर-मानक बैक स्टैक व्यवहार बना सकता है और आमतौर पर अनुशंसित या अच्छा अभ्यास नहीं माना जाता है।
- यह कानूनी है, लेकिन मुद्रास्फीति उस सिस्टम के लिए डिफ़ॉल्ट थीम के साथ की जाएगी जिस पर आप चल रहे हैं, न कि आपके आवेदन में क्या परिभाषित किया गया है।
- यदि रिसीवर अशक्त है, जो कि एंड्रॉइड 4.2 और उसके बाद के संस्करण पर एक चिपचिपा प्रसारण के वर्तमान मूल्य को प्राप्त करने के लिए उपयोग किया जाता है।
Context
Actvity
या Application
नए बनाए गए घटकों के बारे में जानकारी प्रदान करता है ।
Context
नव निर्मित घटकों को प्रासंगिकता प्रदान की जानी चाहिए (चाहे आवेदन संदर्भ या गतिविधि संदर्भ)
चूंकि Activity
एक उपवर्ग है Context
, इसलिए this
उस गतिविधि के संदर्भ को प्राप्त करने के लिए व्यक्ति इसका उपयोग कर सकता है
ए Context
है: