android - GetContext(), getAplicationContext(), getBaseContext() और "यह" के बीच अंतर
this android-context (5)
getAplicationContext () - एप्लिकेशन में चल रही सभी गतिविधियों के लिए संदर्भ देता है।
getBaseContext () - यदि आप कॉन्टेक्स्ट को एप्लिकेशन के भीतर किसी अन्य संदर्भ से एक्सेस करना चाहते हैं तो आप एक्सेस कर सकते हैं।
getContext () - संदर्भ दृश्य को केवल वर्तमान चलती गतिविधि देता है।
getApplicationContext()
, getBaseContext()
, getBaseContext()
, और " this
" के बीच क्या अंतर है?
हालांकि यह एक साधारण सवाल है, लेकिन मैं उनके बीच बुनियादी अंतर को समझने में असमर्थ हूं। यदि संभव हो तो कृपया कुछ आसान उदाहरण दें।
अधिकांश उत्तरों पहले से ही getContext()
और getApplicationContext()
लेकिन getBaseContext () को शायद ही कभी समझाया जाता है।
विधि getBaseContext()
केवल तभी प्रासंगिक होती है जब आपके पास ContextWrapper
। एंड्रॉइड एक ContextWrapper
वर्ग प्रदान करता है जो किसी मौजूदा Context
के आसपास बनाया गया है:
ContextWrapper wrapper = new ContextWrapper(context);
ContextWrapper
का उपयोग करने का लाभ यह है कि यह आपको "मूल संदर्भ को बदलने के बिना व्यवहार को संशोधित करने देता है"। उदाहरण के लिए, यदि आपके पास मेरी एक्टिविटी नामक गतिविधि है तो myActivity
तुलना में एक अलग थीम के साथ एक View
बना सकता है:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
वास्तव में शक्तिशाली है क्योंकि यह आपको संसाधनों (जैसे openFileInput()
, getString()
) तक पहुंचने के लिए कोड सहित Context
सहित प्रदान किए गए अधिकांश कार्यों को ओवरराइड करने देता है, अन्य घटकों (जैसे sendBroadcast()
, registerReceiver()
sendBroadcast()
साथ बातचीत करता है, अनुमतियों का अनुरोध करता है (उदाहरण के लिए checkCallingOrSelfPermission()
) और फ़ाइल सिस्टम स्थानों को हल करना (उदाहरण के लिए getFilesDir()
)। ContextWrapper
डिवाइस / संस्करण विशिष्ट समस्याओं के आसपास काम करने के लिए वास्तव में उपयोगी है या संदर्भों की आवश्यकता वाले घटकों के लिए एक-ऑफ अनुकूलन लागू करने के लिए।
विधि BaseContext () को "बेस" संदर्भ तक पहुंचने के लिए उपयोग किया जा सकता है जिसे 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();
}
}
}
प्रश्न "कॉन्टेक्स्ट क्या है" एंड्रॉइड ब्रह्मांड में सबसे कठिन प्रश्नों में से एक है।
संदर्भ उन तरीकों को परिभाषित करता है जो सिस्टम संसाधनों तक पहुंचते हैं, एप्लिकेशन की स्थैतिक संपत्तियों को पुनर्प्राप्त करते हैं, अनुमतियों की जांच करते हैं, यूआई मैनिपुलेशन करते हैं और बहुत कुछ करते हैं। संक्षेप में, Context
उत्पादन में भगवान ऑब्जेक्ट एंटी-पैटर्न का एक उदाहरण है।
जब हम किस तरह के Context
का उपयोग करते हैं, तो यह बहुत जटिल हो जाता है क्योंकि भगवान ऑब्जेक्ट होने के अलावा, Context
उपclass के पदानुक्रमित पेड़ Liskov प्रतिस्थापन सिद्धांत का क्रूरता से उल्लंघन करता है।
यह ब्लॉग पोस्ट विभिन्न स्थितियों में 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
उप-वर्ग है, इसलिए कोई उस गतिविधि के संदर्भ को प्राप्त करने के लिए इसका उपयोग कर सकता है
View.getContext()
: उस संदर्भ को वापस लौटाता है जिसमें दृश्य वर्तमान में चल रहा है। आमतौर पर वर्तमान में सक्रिय गतिविधि।Activity.getApplicationContext()
: पूरे एप्लिकेशन के लिए संदर्भ देता है (प्रक्रिया सभी गतिविधियों के अंदर चल रही है)। वर्तमान गतिविधि संदर्भ के बजाय इसका उपयोग करें यदि आपको पूरे गतिविधि के जीवन चक्र से जुड़े संदर्भ की आवश्यकता है, न केवल वर्तमान गतिविधि।ContextWrapper.getBaseContext()
: यदि आपको किसी अन्य संदर्भ में किसी संदर्भ में पहुंच की आवश्यकता है, तो आप ContextWrapper का उपयोग करें। संदर्भ में संदर्भित किया गया है कि ContextWrapper को GetBaseContext () के माध्यम से एक्सेस किया जाता है।