Android पर 'संदर्भ' क्या है?


1967

एंड्रॉइड प्रोग्रामिंग में, वास्तव में एक Contextवर्ग क्या है और इसका उपयोग किस लिए किया जाता है?

मैं डेवलपर साइट पर इसके बारे में पढ़ता हूं , लेकिन मैं इसे स्पष्ट रूप से समझने में असमर्थ हूं।


जवाबों:


1506

इसे सीधे शब्दों में कहें:

जैसा कि नाम से पता चलता है, यह अनुप्रयोग / वस्तु की वर्तमान स्थिति का संदर्भ है। यह नव निर्मित वस्तुओं को समझने देता है कि क्या चल रहा है। आमतौर पर आप इसे अपने कार्यक्रम के दूसरे भाग (गतिविधि और पैकेज / अनुप्रयोग) के बारे में जानकारी प्राप्त करने के लिए कहते हैं।

आप लागू द्वारा संदर्भ प्राप्त कर सकते हैं getApplicationContext(), getContext(), getBaseContext()या this(जब एक वर्ग है कि तक फैली हुई है में Context, इस तरह के आवेदन, गतिविधि, सेवा और IntentService वर्ग के रूप में)।

संदर्भ के विशिष्ट उपयोग:

  • नई वस्तुएं बनाना: नए विचार, एडेप्टर, श्रोता बनाना:

    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
    
  • मानक सामान्य संसाधनों तक पहुँच : LAYOUT_INFLATER_SERVICE, SharedPreferences जैसी सेवाएँ:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
    
  • एक्सेसिंग घटकों का निहितार्थ : सामग्री प्रदाताओं, प्रसारण, आशय के बारे में

    getApplicationContext().getContentResolver().query(uri, ...);

51
आपके उदाहरण में context.getSystemService(LAYOUT_INFLATER_SERVICE), कहाँ और कैसे contextपरिभाषित किया गया है?
डेनिस

8
यह अच्छी तरह से समझाया गया है कि गतिशील रूप से पाठ दृश्य बनाते समय हमें संदर्भ की आवश्यकता क्यों है। लेकिन गतिशील रूप से पाठ विचारों के सरणियों का निर्माण करते समय हमें किसी भी संदर्भ का उल्लेख नहीं करना पड़ता है। ऐसा क्यों हैं ? TextView [] textview = नया TextView [10];
अभिनव अरोरा

38
सरणी को परिभाषित करते समय @AbhinavArora, आप वास्तव में किसी भी पाठ दृश्य का एक उदाहरण का निर्माण नहीं कर रहे हैं (आप मूल रूप से सिर्फ उनके लिए जगह बनाने के लिए)। उस बिंदु पर आप किसी भी मान को सरणी में रखने के लिए आते हैं, आपको या तो पहले से बनाए गए TextViews की आवश्यकता होगी, या आपको उन्हें बनाने की अनुमति देने के लिए एक संदर्भ की आवश्यकता होगी।
mc1arke

24
विचारों को संदर्भ की आवश्यकता क्यों है? उदाहरण के लिए, अगर यह संदर्भ नहीं था तो टेक्स्ट दृश्य क्या नहीं कर पाएगा?
डायनोसोर

15
एक "संदर्भ" के बिना कोड का एक टुकड़ा प्रत्येक ऑपरेटिंग सिस्टम पर चल सकता है जिसमें JVM है। लेकिन अगर कोई संदर्भ है तो इसे Android पर चलना चाहिए। यदि आप Android विशिष्ट चीजों का उपयोग करना चाहते हैं (डिवाइस स्थान पर पहुंचना, फोटो लेना, पृष्ठभूमि सेवा चलाना आदि) तो आपको एक संदर्भ की आवश्यकता है, हालांकि आपको एक बनाने की आवश्यकता नहीं है http अनुरोध। संदर्भ को जावा और एंड्रॉइड के बीच एक पुल के रूप में माना जा सकता है।
फारुक टोपसस

507

प्रसंग की परिभाषा

  • संदर्भ पर्यावरण डेटा का प्रतिनिधित्व करता है
  • यह डेटाबेस जैसी चीजों तक पहुंच प्रदान करता है

सरल शब्द (उदाहरण 1)

  • पर्सन-एक्स एक स्टार्ट-अप सॉफ्टवेयर कंपनी के सीईओ हैं।

  • कंपनी में एक लीड आर्किटेक्ट मौजूद है, यह लीड आर्किटेक्ट कंपनी में सभी काम करता है जिसमें डेटाबेस, यूआई आदि शामिल होते हैं।

  • अब सीईओ एक नया डेवलपर काम पर रखता है।

  • यह आर्किटेक्ट है जो नए व्यक्ति के कौशल के आधार पर नए काम पर रखने वाले व्यक्ति की जिम्मेदारी बताता है कि वह डेटाबेस या यूआई आदि पर काम करेगा या नहीं।

सरल शब्द (उदाहरण 2)

  • यह ऐप के संसाधन के लिए एंड्रॉइड गतिविधि की पहुंच की तरह है।

  • यह उसी तरह है जब आप किसी होटल में जाते हैं, आप उचित समय में नाश्ता, दोपहर का भोजन और रात का खाना चाहते हैं?

  • ठहरने के दौरान आपको और भी कई चीजें पसंद होती हैं। आपको ये चीजें कैसे मिलती हैं?

  • आप रूम-सर्विस वाले से ये चीजें आपके लिए लाने के लिए कहते हैं।

  • यहां रूम-सर्विस व्यक्ति वह संदर्भ है जिस पर विचार करते हुए कि आप एकल गतिविधि हैं और होटल आपका ऐप है, अंत में नाश्ता, दोपहर का भोजन और रात का खाना संसाधनों का होना चाहिए।


संदर्भ में शामिल चीजें हैं:

  1. एक संसाधन लोड हो रहा है।
  2. एक नई गतिविधि शुरू करना।
  3. विचार बनाना।
  4. सिस्टम सेवा प्राप्त करना।

गतिविधि , सेवा , अनुप्रयोग , आदि के लिए संदर्भ आधार वर्ग है

इसका वर्णन करने का एक और तरीका: टीवी में चैनल और चैनल के रिमोट के रूप में संदर्भ पर विचार करें, इंटेंस आदि का उपयोग करते हुए संसाधन, सेवाएं, - - - यहां दूरस्थ सभी अलग-अलग संसाधनों तक पहुंच प्राप्त करने के लिए एक पहुंच के रूप में कार्य करते हैं।

  • इसलिए, रिमोट का उपयोग संसाधनों, सेवाओं, इंटेंट आदि का उपयोग करने जैसे चैनलों तक पहुंच है ...।

  • इसी तरह ... जिसके पास प्राकृतिक रूप से रिमोट का उपयोग होता है, उसके पास संसाधनों, सेवाओं, इंटेंट्स आदि का उपयोग करने जैसी सभी चीजें होती हैं


विभिन्न विधियाँ जिनके द्वारा आप संदर्भ प्राप्त कर सकते हैं

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • या this(जब गतिविधि वर्ग में)

उदाहरण:

TextView tv = new TextView(this);

कीवर्ड thisवर्तमान गतिविधि के संदर्भ को संदर्भित करता है।


3
ठीक है, इसलिए गतिविधि से प्राप्त वर्ग एक संदर्भ ही है। इसीलिए इसे नए बनाए गए विचारों से जोड़कर, हम संदर्भ को पास करते हैं।
०५

7
मुझे आश्चर्य है कि क्या यह एक अच्छा डिजाइन निर्णय है संदर्भ इतने सारे अलग-अलग स्थानों से सुलभ है? आवेदन में एक स्थिर getContext () मेरी राय में पर्याप्त होगा।
ट्रिलियनियन डेस

@Trilarion ... यह कैसे आप संदर्भ का उपयोग करना चाहते पर निर्भर करता है getApplicationContext(), getContext(), getBaseContext()..... इस संदर्भ लें -> ( stackoverflow.com/a/10641257 )
Devrath

बस एक टेक्स्टव्यू बनाने के साथ अंतिम टुकड़े का विस्तार करने के लिए: कुछ मामलों में कॉल करने के लिए आवश्यक हो सकता है SomeActivityName.this। एक उदाहरण के लिए एक सूत्र में, thisतेह धागा को संदर्भित करता है और नहीं गतिविधि
झो

1
क्या एपीके या एंड्रॉइड ओएस के लिए संदर्भ वस्तु अद्वितीय है? क्या किसी एप्लिकेशन के दो अलग-अलग संदर्भ हो सकते हैं?
वैलीजॉन

366

स्रोत


Android में प्रसंग का विषय कई लोगों को भ्रमित करने वाला लगता है। लोगों को बस पता है कि एंड्रॉइड में बुनियादी चीजों को करने के लिए प्रसंग की बहुत आवश्यकता है। लोग कभी-कभी घबराते हैं क्योंकि वे कुछ ऑपरेशन करने की कोशिश करते हैं जिनके लिए कॉन्सेप्ट की आवश्यकता होती है और वे नहीं जानते कि कैसे सही कॉन्सेप्ट को "प्राप्त" किया जाए। मैं Android में Context के विचार को ध्वस्त करने का प्रयास करने जा रहा हूं। मुद्दे का एक पूर्ण उपचार इस पोस्ट के दायरे से परे है, लेकिन मैं एक सामान्य अवलोकन देने की कोशिश करूंगा ताकि आपको समझ में आ जाए कि संदर्भ क्या है और इसका उपयोग कैसे किया जाए। यह समझने के लिए कि संदर्भ क्या है, आइए स्रोत कोड पर एक नज़र डालें:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

वास्तव में प्रसंग क्या है?

ठीक है, दस्तावेज़ीकरण स्वयं को एक सरल व्याख्या प्रदान करता है: संदर्भ वर्ग "एक अनुप्रयोग वातावरण के बारे में वैश्विक जानकारी के लिए इंटरफ़ेस" है।

प्रसंग वर्ग को ही सार वर्ग के रूप में घोषित किया गया है, जिसका कार्यान्वयन Android OS द्वारा प्रदान किया गया है। प्रलेखन आगे प्रदान करता है कि कॉन्टेक्ट "... एप्लिकेशन-विशिष्ट संसाधनों और कक्षाओं तक पहुंच के साथ-साथ एप्लिकेशन-स्तरीय संचालन जैसे लॉन्चिंग गतिविधियों, प्रसारण और इंटेंस प्राप्त करने, आदि के लिए कॉल करता है"।

आप बहुत अच्छी तरह से समझ सकते हैं, अब, क्यों नाम प्रसंग है। ऐसा इसलिए है क्योंकि यह सिर्फ इतना है। एक गतिविधि, सेवा, या किसी अन्य घटक के लिए, यदि आप चाहें, तो लिंक या हुक प्रदान करता है, जिससे इसे सिस्टम से जोड़ा जा सकता है, जिससे वैश्विक अनुप्रयोग पर्यावरण तक पहुंच हो सकती है। दूसरे शब्दों में: संदर्भ "आम तौर पर ऐप के संबंध में नरक मैं कहां हूं और बाकी एप्लिकेशन के साथ मैं कैसे पहुंच / संवाद करता हूं?" यदि यह सब थोड़ा भ्रमित करने वाला लगता है, तो प्रसंग वर्ग द्वारा बताए गए तरीकों पर एक त्वरित नज़र इसके वास्तविक स्वरूप के बारे में कुछ और सुराग प्रदान करता है।

यहाँ उन तरीकों का एक यादृच्छिक नमूना है:

  1. getAssets()
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

इन सभी तरीकों में क्या आम है? वे सभी सक्षम हैं जिनके पास संदर्भ तक पहुंच है, वे एप्लिकेशन-वाइड संसाधनों तक पहुंचने में सक्षम हैं।

संदर्भ, दूसरे शब्दों में, उस घटक को हुक करता है, जिसका अनुप्रयोग के बाकी वातावरण में संदर्भ होता है। उदाहरण के लिए, आपकी परियोजना में संपत्ति ('संपत्ति' फ़ोल्डर), उदाहरण के लिए, आवेदन भर में उपलब्ध हैं, बशर्ते कि एक गतिविधि, सेवा या जो कुछ भी जानता है कि उन संसाधनों का उपयोग कैसे किया जाए। उसी के लिए जाता है, getResources()जो उन चीजों को करने की अनुमति देता है, getResources().getColor()जो आपको colors.xmlसंसाधन में शामिल कर देगा (कोई बात नहीं कि aapt जावा कोड के माध्यम से संसाधनों तक पहुंच को सक्षम करता है, यह एक अलग मुद्दा है)।

अपस्टैट वह Contextहै जो सिस्टम संसाधनों तक पहुंच और इसके घटकों को "अधिक एप्लिकेशन" में हुक करता है। आइए उपवर्गों पर नजर डालते हैं Context, वे कक्षाएं जो अमूर्त Contextवर्ग का कार्यान्वयन प्रदान करती हैं । सबसे स्पष्ट वर्ग वह वर्ग है जो विरासत में मिला है ActivityActivityसे ContextThemeWrapperहै, जो से विरासत में मिली ContextWrapper, से जो विरासत में मिली Contextही। उन वर्गों एक गहरे स्तर पर चीजों को समझने के लिए को देखने के लिए उपयोगी होते हैं, लेकिन अब ऐसा लगता है कि पता करने के लिए पर्याप्त है ContextThemeWrapperऔर ContextWrapperकाफी वे क्या तरह ध्वनि कर रहे हैं। वे का सार तत्व को लागू Contextएक संदर्भ (वास्तविक संदर्भ) को "रैपिंग" करके खुद को और उन कार्यों को उस संदर्भ में सौंपना। एक उदाहरण सहायक है -ContextWrapperकक्षा, कक्षा से सार विधि getAssetsइस Contextप्रकार लागू की जाती है:

@Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

mBaseबस एक विशिष्ट संदर्भ के लिए निर्माता द्वारा निर्धारित एक क्षेत्र है। तो एक संदर्भ लपेटा जाता है और ContextWrapperउस संदर्भ में getAssets विधि के इसके कार्यान्वयन को दर्शाता है। आइए उस Activityवर्ग की जांच करने के लिए वापस जाएं जो अंत में विरासत में मिला है Contextयह देखने के लिए कि यह सब कैसे काम करता है।

आप शायद जानते हैं कि एक गतिविधि क्या है, लेकिन समीक्षा करने के लिए - यह मूल रूप से एक एकल चीज़ है जो उपयोगकर्ता कर सकता है। यह एक विंडो प्रदान करने का ध्यान रखता है जिसमें यूआई को रखने के लिए उपयोगकर्ता के साथ बातचीत करता है '। अन्य एपीआई और गैर-डेवलपर्स से परिचित डेवलपर्स शायद इसे "स्क्रीन" के रूप में अलौकिक रूप से सोच सकते हैं। यह तकनीकी रूप से गलत है, लेकिन यह हमारे उद्देश्यों के लिए मायने नहीं रखता है। तो कैसे Activityऔर Contextबातचीत करते हैं और वास्तव में उनके वंशानुक्रम में क्या हो रहा है?

फिर से, यह विशिष्ट उदाहरणों को देखने के लिए सहायक है। हम सभी जानते हैं कि गतिविधियों को कैसे शुरू किया जाए। बशर्ते आपके पास "संदर्भ" है जिसमें से आप गतिविधि शुरू कर रहे हैं, आप बस फोन करते हैं startActivity(intent), जहां आशय उस संदर्भ का वर्णन करता है जहां से आप एक गतिविधि शुरू कर रहे हैं और गतिविधि जिसे आप शुरू करना चाहते हैं। यह परिचित है startActivity(this, SomeOtherActivity.class)

और क्या है this? thisअपनी गतिविधि है क्योंकि Activityवर्ग से विरासत में मिला है Context। पूर्ण स्कूप इस तरह है: जब आप कॉल करते हैं startActivity, तो अंततः Activityक्लास कुछ इस तरह निष्पादित करता है:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);

तो यह इस्तेमाल execStartActivityसे Instrumentationवर्ग (वास्तव में एक आंतरिक वर्ग से Instrumentationकहा जाता है ActivityResult)।

इस बिंदु पर, हम सिस्टम इंटर्नल्स पर एक झलक पाने लगे हैं।

यह वह जगह है जहां ओएस वास्तव में सब कुछ संभालता है। तो इंस्ट्रूमेंटेशन वास्तव में गतिविधि कैसे शुरू करता है? ठीक है, ऊपर thisकी execStartActivityविधि में परम आपकी गतिविधि, अर्थात संदर्भ, और execStartActivityइस संदर्भ का उपयोग करता है।

30,000 ओवरव्यू यह है: इंस्ट्रूमेंटेशन क्लास उन गतिविधियों की एक सूची पर नज़र रखता है जो इसे काम करने के लिए निगरानी कर रही हैं। इस सूची का उपयोग सभी गतिविधियों के समन्वय के लिए किया जाता है और सुनिश्चित करें कि गतिविधियों के प्रवाह को प्रबंधित करने में सब कुछ सुचारू रूप से चलता है।

कुछ ऐसे ऑपरेशन हैं, जिन पर मैंने पूरी तरह से ध्यान नहीं दिया है, जो थ्रेड और प्रक्रिया के मुद्दों को समन्वयित करते हैं। अंततः, ActivityResultएक देशी ऑपरेशन का उपयोग करता है - ActivityManagerNative.getDefault().startActivity()जो Contextआपके द्वारा पास किए जाने पर आपके द्वारा उपयोग किए गए का उपयोग करता है startActivity। यदि आप जिस संदर्भ में पास हुए हैं उसका उपयोग "इरादे के संकल्प" में यदि आवश्यक हो तो सहायता के लिए किया जाता है। इंटेंट रेजोल्यूशन वह प्रक्रिया है जिसके द्वारा सिस्टम सप्लाई न होने पर इरादे के लक्ष्य को निर्धारित कर सकता है। (अधिक जानकारी के लिए यहां गाइड देखें)।

और ऐसा करने के लिए एंड्रॉइड के लिए, उसे उस जानकारी तक पहुंच की आवश्यकता होती है जो उसके द्वारा आपूर्ति की जाती है Context। विशेष रूप से, सिस्टम को इस तक पहुंचने की आवश्यकता है ContentResolverकि वह "इरादे के डेटा के MIME प्रकार को निर्धारित कर सकता है"। यह पूरी तरह startActivityसे संदर्भ का उपयोग कैसे करता है थोड़ा जटिल था और मैं खुद को आंतरिक रूप से पूरी तरह से नहीं समझता हूं। मेरा मुख्य बिंदु केवल यह वर्णन करना था कि किसी एप्लिकेशन के लिए आवश्यक कई ऑपरेशन करने के लिए एप्लिकेशन-वाइड संसाधनों तक कैसे पहुँचा जा सकता है। Contextयह इन संसाधनों तक पहुँच प्रदान करता है। एक सरल उदाहरण दृश्य हो सकता है। हम सभी जानते हैं कि आप क्या बनाते हैं। कस्टम विस्तार RelativeLayoutया किसी अन्य Viewवर्ग के द्वारा, आपको एक कंस्ट्रक्टर प्रदान करना होगा जो एक लेता हैContextएक तर्क के रूप में। जब आप अपने कस्टम को तुरंत देखते हैं तो आप संदर्भ में पास होते हैं। क्यों? क्योंकि दृश्य को थीम, संसाधनों और अन्य व्यू कॉन्फ़िगरेशन विवरण तक पहुंच प्राप्त करने में सक्षम होना चाहिए। कॉन्फ़िगरेशन देखना वास्तव में एक महान उदाहरण है। प्रत्येक संदर्भ में विभिन्न पैरामीटर ( Context'कार्यान्वयन में क्षेत्र ) होते हैं जो ओएस द्वारा खुद को प्रदर्शन के आयाम या घनत्व जैसी चीजों के लिए निर्धारित किया जाता है। यह देखना आसान है कि दृश्य, आदि की स्थापना के लिए यह जानकारी क्यों महत्वपूर्ण है।

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

एंड्रॉइड का अपना प्रतिमान है और एक निश्चित पैटर्न है जो वास्तव में काफी सुसंगत है यदि आपकी पूर्व-निर्धारित धारणाओं को छोड़ दें और बस प्रलेखन और देव गाइड पढ़ें। मेरा वास्तविक बिंदु, हालांकि, "सही संदर्भ प्राप्त करना" कभी-कभी मुश्किल हो सकता है, लोग अनुचित रूप से घबराते हैं क्योंकि वे ऐसी स्थिति में भागते हैं जहां उन्हें संदर्भ की आवश्यकता होती है और लगता है कि उनके पास ऐसा नहीं है। एक बार फिर, जावा एक ऑब्जेक्ट-ओरिएंटेड डिज़ाइन के साथ ऑब्जेक्ट-ओरिएंटेड भाषा है।

आपकी गतिविधि के अंदर केवल आपके पास "संदर्भ" है क्योंकि आपकी गतिविधि स्वयं प्रसंग से विरासत में मिली है। इसमें कोई जादू नहीं है (सभी सामानों को छोड़कर जो ओएस विभिन्न मापदंडों को निर्धारित करने और अपने संदर्भ को सही ढंग से "कॉन्फ़िगर" करने के लिए करता है)। इसलिए, स्मृति / प्रदर्शन के मुद्दों को एक तरफ रखना (जैसे कि संदर्भ के संदर्भ को तब पकड़ना जब आपको इसकी आवश्यकता नहीं है या इसे इस तरह से करना है कि स्मृति, आदि पर नकारात्मक परिणाम हों), संदर्भ किसी भी अन्य की तरह एक वस्तु है और इसे पास किया जा सकता है किसी भी POJO (सादे पुराने जावा ऑब्जेक्ट) की तरह। कभी-कभी आपको उस संदर्भ को पुनः प्राप्त करने के लिए चतुर चीजें करने की आवश्यकता हो सकती है, लेकिन कोई भी नियमित जावा वर्ग जो ऑब्जेक्ट के अलावा और कुछ भी नहीं से फैली हुई है, उस तरह से लिखा जा सकता है, जिसमें संदर्भ तक पहुंच हो; बस एक सार्वजनिक विधि को उजागर करता है जो एक संदर्भ लेता है और फिर आवश्यकतानुसार उस कक्षा में इसका उपयोग करता है।


33
यह एक उत्कृष्ट उत्तर है। स्वीकार किए गए से बेहतर है, जो केवल वही कहता है जो हर कोई सहज रूप से जानता है।
होन्ज़ा कालफस

5
यह वह लंबा उत्तर है जिसकी आपको तलाश है! अच्छी तरह से समझाया
निक जियान

4
बहुत बढ़िया! गंभीरता से!
ज़ीखुंग

3
हममम, मुझे ऐसा लगता है कि सब लगता है कि हम क्या वर्ष वैश्विक चर कहा करते थे टाइमर, जो ज्यादा पर जब वस्तु उन्मुखीकरण दृश्य 8-) में प्रवेश किया सिकोड़ी था
Ulf Edholm

तो Context मैं getApplicationContext से प्राप्त होता है क्या यह गतिविधि में getContext के समान है?
जेपीएम

119

एक संदर्भ प्रणाली के लिए एक संभाल है; यह संसाधनों को हल करने, डेटाबेस और वरीयताओं तक पहुंच प्राप्त करने, और इसी तरह की सेवाएं प्रदान करता है। एक एंड्रॉइड ऐप में गतिविधियां हैं। संदर्भ आपके अनुप्रयोग के वर्तमान में चल रहे परिवेश के लिए एक हैंडल की तरह है। गतिविधि ऑब्जेक्ट को संदर्भ ऑब्जेक्ट विरासत में मिला है।

अधिक जानकारी के लिए, एंड्रॉइड स्टूडियो - ट्यूटोरियल के साथ एंड्रॉइड डेवलपमेंट का परिचय देखें


88

Contextएक अनुप्रयोग वातावरण के बारे में वैश्विक जानकारी के लिए एक "इंटरफ़ेस" है। व्यवहार में, Contextवास्तव में एक अमूर्त वर्ग है , जिसका कार्यान्वयन एंड्रॉइड सिस्टम द्वारा प्रदान किया गया है।

यह एप्लिकेशन-विशिष्ट संसाधनों और कक्षाओं तक पहुंच के साथ-साथ एप्लिकेशन-स्तरीय संचालन के लिए कॉल-अप करने की अनुमति देता है, जैसे कि लॉन्चिंग गतिविधियां, प्रसारण और प्राप्त करना, आदि।

निम्नलिखित तस्वीर में, आप कक्षाओं का एक पदानुक्रम देख सकते हैं, जहां Contextइस पदानुक्रम का मूल वर्ग है। विशेष रूप से, यह इस बात पर जोर देने के लायक है कि Activityकिसका वंशज है Context

गतिविधि आरेख


यह तस्वीर कैसे उत्पन्न हुई?
d0ye

70

Contextवास्तव में क्या है?

Android संदर्भ प्रलेखन के अनुसार, यह एक इकाई है जो विभिन्न पर्यावरण डेटा का प्रतिनिधित्व करती है। यह स्थानीय फ़ाइलों, डेटाबेस, पर्यावरण से जुड़े वर्ग लोडर, सेवाओं (सिस्टम-स्तरीय सेवाओं सहित), और अधिक तक पहुंच प्रदान करता है। इस पुस्तक के दौरान, और Android के साथ आपके दिन-प्रतिदिन के कोडिंग में, आप देखेंगे कि प्रसंग अक्सर पास होता है।

" एंड्रॉइड इन प्रैक्टिस " पुस्तक से, पी। 60।

कई एंड्रॉइड एपीआई को एक Contextपैरामीटर के रूप में आवश्यकता होती है

यदि आप विभिन्न Android एपीआई के माध्यम से देखते हैं, तो आप देखेंगे कि उनमें से कई android.content.Contextएक पैरामीटर के रूप में एक वस्तु लेते हैं । आप यह भी देखेंगे कि एक गतिविधि या एक सेवा आमतौर पर एक के रूप में उपयोग की जाती है Context। यह काम करता है क्योंकि इन दोनों वर्गों का विस्तार होता है Context


52

contextएंड्रॉइड में समझने के लिए सरल उदाहरण :

प्रत्येक बॉस के पास सभी महत्वपूर्ण और समय लेने वाले कार्यों की देखभाल करने के लिए एक सहायक है। यदि एक फ़ाइल या एक कप कॉफी की जरूरत है, तो एक सहायक रन पर है। कुछ बॉस मुश्किल से जानते हैं कि कार्यालय में क्या चल रहा है, इसलिए वे अपने सहायकों से इस बारे में पूछते हैं। वे कुछ काम स्वयं करते हैं लेकिन ज्यादातर अन्य चीजों के लिए उन्हें अपने सहायकों की मदद की आवश्यकता होती है।

इस परिदृश्य में,

बॉस - एंड्रॉइड एप्लिकेशन है

सहायक - प्रसंग है

कॉफी की फाइलें / कप - संसाधन हैं

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

कुछ ऑपरेशन (वे चीजें जहां सहायक की जरूरत होती है) जहां संदर्भ शामिल है:

  • सामान्य संसाधन लोड हो रहे हैं
  • गतिशील विचार बनाना
  • टोस्ट संदेश प्रदर्शित करना
  • गतिविधियों आदि का शुभारंभ

संदर्भ प्राप्त करने के विभिन्न तरीके:

getContext()

getBaseContext()

getApplicationContext()

this

47

एक Android संदर्भ एक इंटरफ़ेस है (सामान्य अर्थों में, जावा अर्थों में नहीं, जावा में, Contextवास्तव में एक अमूर्त वर्ग है!) जो विशिष्ट संसाधनों और वर्ग तक पहुँचने और अनुप्रयोग वातावरण के बारे में जानकारी देने की अनुमति देता है।

यदि आपका एंड्रॉइड ऐप एक वेब ऐप था, तो आपका संदर्भ कुछ इसी तरह होगा ServletContext(मैं यहां सटीक तुलना नहीं कर रहा हूं)।

आपकी गतिविधियाँ और सेवाएँ भी विस्तारित होती हैं Context, इसलिए वे उन सभी तरीकों को विरासत में लेते हैं , जिनमें पर्यावरण की जानकारी पहुँचती है, जिसमें ऐप चल रहा है।


35
  • Context पर्यावरण डेटा प्राप्त करने के लिए एक हैंडल का प्रतिनिधित्व करता है।
  • Context कक्षा को ही सार के रूप में घोषित किया गया है, जिसका कार्यान्वयन एंड्रॉइड ओएस द्वारा प्रदान किया गया है।
  • Context एक टीवी के रिमोट की तरह है और टेलीविजन में चैनल संसाधनों, सेवाओं आदि हैं। यहां छवि विवरण दर्ज करें

तुम्हारे द्वारा इससे क्या किया जा सकता है ?

  • संसाधन लोड हो रहा है।
  • एक नई गतिविधि शुरू करना।
  • विचार बनाना।
  • सिस्टम सेवा प्राप्त करना।

संदर्भ पाने के तरीके:

  • getApplicationContext()
  • getContext()
  • getBaseContext()यहां छवि विवरण दर्ज करेंयहां छवि विवरण दर्ज करें

18

बस इसे बाहर वहाँ newbies के लिए डाल;

तो सबसे पहले Word Context को समझें:

अंग्रेजी-लिब में। इसका मतलब:

"ऐसी परिस्थितियाँ जो किसी घटना, कथन या विचार के लिए सेटिंग का निर्माण करती हैं, और जिसके संदर्भ में इसे पूरी तरह से समझा और मूल्यांकन किया जा सकता है।"

"लिखित या बोली जाने वाली किसी चीज़ के अंश जो तुरंत पहले से हो जाते हैं और किसी शब्द या अंश का अनुसरण करते हैं और उसका अर्थ स्पष्ट करते हैं।"

अब प्रोग्रामिंग दुनिया के लिए समान समझ लें:

आवेदन / वस्तु की वर्तमान स्थिति का संदर्भ। यह नव निर्मित वस्तुओं को समझने देता है कि क्या चल रहा है। आमतौर पर आप इसे अपने कार्यक्रम के दूसरे भाग (गतिविधि, पैकेज / आवेदन) के बारे में जानकारी प्राप्त करने के लिए कहते हैं

आप संदर्भ प्राप्त कर सकते हैं getApplicationContext(), getContext(), getBaseContext()या this(गतिविधि वर्ग में)।

निम्नलिखित कोड के उपयोग में कहीं भी संदर्भ प्राप्त करने के लिए:

AppContextअपने Android एप्लिकेशन के अंदर नई कक्षा बनाएं

public class AppContext extends Application {

    private static Context context;

    public void onCreate(){
        super.onCreate();
        AppContext.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return AppContext.context;
    }
}

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

उममीद है कि इससे मदद मिलेगी ;)


17

इसे वीएम के रूप में सोचें, जिसने ऐप या सेवा को चलाने की प्रक्रिया को चुप कर दिया है। मौन वातावरण में अंतर्निहित सिस्टम जानकारी और कुछ अनुमत संसाधनों के एक समूह तक पहुंच है। आपको उन सेवाओं को प्राप्त करने के लिए उस संदर्भ की आवश्यकता है।


17

प्रसंग इस रूप में वर्तमान वस्तु का एक संदर्भ है। संदर्भ भी अनुप्रयोग वातावरण के बारे में जानकारी तक पहुँचने की अनुमति देता है।


13

वर्ग android.content.Contextएंड्रॉइड सिस्टम और प्रोजेक्ट के संसाधनों के लिए कनेक्शन प्रदान करता है। यह अनुप्रयोग वातावरण के बारे में वैश्विक जानकारी के लिए इंटरफ़ेस है।

संदर्भ Android सेवा, जैसे स्थान सेवा, तक पहुँच प्रदान करता है।

गतिविधियाँ और सेवाएँ Contextकक्षा का विस्तार करती हैं ।


9

प्रसंग वर्ग का उदाहरण है Android.content.Context Android प्रणाली को कनेक्शन प्रदान करता है जो अनुप्रयोग को निष्पादित करता है। उदाहरण के लिए, आप प्रसंग के माध्यम से वर्तमान डिवाइस डिस्प्ले के आकार की जांच कर सकते हैं।

यह परियोजना के संसाधनों तक पहुंच भी देता है। यह अनुप्रयोग वातावरण के बारे में वैश्विक जानकारी के लिए इंटरफ़ेस है।

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

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


9

संदर्भ एक अनुप्रयोग वातावरण के बारे में वैश्विक जानकारी के लिए एक इंटरफ़ेस है। यह एक अमूर्त वर्ग है जिसका कार्यान्वयन Androidप्रणाली द्वारा प्रदान किया गया है।

Context एप्लिकेशन-विशिष्ट संसाधनों और कक्षाओं तक पहुंच के साथ-साथ एप्लिकेशन-स्तरीय संचालन जैसे कॉल की अनुमति देता है launching activities, broadcasting and receiving intents, etc.

यहाँ उदाहरण है

 public class MyActivity extends Activity {

      public void Testing() {

      Context actContext = this; /*returns the Activity Context since   Activity extends Context.*/

      Context appContext = getApplicationContext();    /*returns the context of the single, global Application object of the current process. */

      Button BtnShowAct1 = (Button) findViewById(R.id.btnGoToAct1);
      Context BtnContext = BtnShowAct1.getContext();   /*returns the context of the View. */

अधिक जानकारी के लिए आप http://developer.android.com/reference/android/content/Context.html पर जा सकते हैं


8

संदर्भ मूल रूप से संसाधन के उपयोग और एप्लिकेशन के पर्यावरण विवरण (एप्लिकेशन संदर्भ के लिए) या गतिविधि (गतिविधि के संदर्भ के लिए) या किसी अन्य जानकारी के लिए है ...

मेमोरी लीक से बचने के लिए आपको हर घटक के लिए एप्लिकेशन संदर्भ का उपयोग करना चाहिए जिसके लिए संदर्भ ऑब्जेक्ट की आवश्यकता है .... यहां क्लिक करें


8

संदर्भ अनुप्रयोग / वस्तु की वर्तमान स्थिति का संदर्भ है। एक इकाई जो विभिन्न पर्यावरण डेटा का प्रतिनिधित्व करती है। संदर्भ वर्तमान गतिविधि को स्थानीय फ़ाइलों, डेटाबेस, पर्यावरण से जुड़े क्लास लोडर, सिस्टम-स्तरीय सेवाओं सहित सेवाओं जैसे आउट-साइड एंड्रॉइड वातावरण के साथ बातचीत करने में मदद करता है।

एक संदर्भ प्रणाली के लिए एक संभाल है। यह संसाधनों को हल करने, डेटाबेस और वरीयताओं तक पहुंच प्राप्त करने, और इसी तरह की सेवाएं प्रदान करता है। Android ऐप में गतिविधियाँ होती हैं। यह उस पर्यावरण के लिए एक संभाल की तरह है जो आपके एप्लिकेशन वर्तमान में चल रहा है। गतिविधि ऑब्जेक्ट को संदर्भ ऑब्जेक्ट विरासत में मिला है।

अलग-अलग आह्वान के तरीके जिनसे आप संदर्भ प्राप्त कर सकते हैं 1. getApplicationContext (), 2. getContext (), 3. getBaseContext () 4. या यह (जब एक्टिविटी क्लास में हो)।


7

संदर्भ का अर्थ है कि एंड्रॉइड को यह पता होना चाहिए कि मुझे किस गतिविधि में जाना चाहिए या उसके लिए कार्य करना चाहिए।

1 - Toast.makeText(context, "Enter All Details", Toast.LENGTH_SHORT).show(); यह इस में इस्तेमाल किया। Context context = ActivityName.this;

2 -startActivity(new Intent(context,LoginActivity.class));

इस संदर्भ में आप किस गतिविधि से दूसरी गतिविधि में जाना चाहते हैं। संदर्भ या ActivityName.this तब तेज़ है, getContext और getApplicatinContext।


6

Contextक्या है हम में से ज्यादातर आवेदन कहते हैं । यह एंड्रॉइड सिस्टम द्वारा बनाया गया है और केवल वही कर सकता है जो कोई एप्लिकेशन कर सकता है। टॉमकैट में, एक प्रसंग यह भी है कि मैं किसी एप्लिकेशन को क्या कहूंगा।

एक प्रसंग है जिसमें कई गतिविधियाँ हैं, प्रत्येक गतिविधि में कई दृश्य हो सकते हैं।

जाहिर है, कुछ कहेंगे कि यह इस या उस वजह से फिट नहीं होता है और वे शायद सही हैं, लेकिन यह कहना कि एक प्रसंग है आपका वर्तमान एप्लिकेशन आपको यह समझने में मदद करेगा कि आप विधि के मापदंडों में क्या डाल रहे हैं।


6

बॉस सहायक सादृश्य

कॉनटेक्स्ट की तकनीकी में गहरी गोता लगाने से पहले एक छोटी सा उपमा देता है

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

तो यहाँ
बॉस - Android अनुप्रयोग
सहायक - संदर्भ
फ़ाइल या कॉफी का कप - संसाधन

क्या आधिकारिक Android डेवलपर साइट प्रसंग के बारे में कहती है

संदर्भ आवेदन से संबंधित संसाधनों के लिए आपका पहुंच बिंदु है

आइए देखते हैं ऐसे ही कुछ संसाधन या कार्य

  • एक गतिविधि शुरू करना।

  • फ़ाइल सिस्टम पर एप्लिकेशन विशिष्ट कैश निर्देशिका के लिए पूर्ण पथ प्राप्त करना।

  • यह निर्धारित करना कि सिस्टम में चलने वाली किसी विशेष प्रक्रिया और उपयोगकर्ता आईडी के लिए दी गई अनुमति है या नहीं।

  • यह जाँचना कि आपको कोई विशेष अनुमति दी गई है या नहीं।

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

किसी भी अन्य वर्ग की तरह Contextही खेतों और विधियों में भी है।
आप Contextआधिकारिक दस्तावेज़ीकरण के बारे में अधिक जानकारी प्राप्त कर सकते हैं , इसमें बहुत अधिक सब कुछ, उपलब्ध तरीके, फ़ील्ड और यहां तक ​​कि कैसे तरीकों के साथ फ़ील्ड का उपयोग करना शामिल है।


हेड्स फॉर @dhssa धन्यवाद। मैं एंड्रॉइड डॉक्स का जिव्हा उपलब्ध कराने की कोशिश कर रहा था .. शाऊल अधिक सावधान रहा। "कॉपी" भाग को हटा दिया
रोहित सिंह 6

5

वर्ग android.content.Context के उदाहरण Android सिस्टम से कनेक्शन प्रदान करते हैं जो एप्लिकेशन को निष्पादित करता है। उदाहरण के लिए, आप प्रसंग के माध्यम से वर्तमान डिवाइस डिस्प्ले के आकार की जांच कर सकते हैं।

यह परियोजना के संसाधनों तक पहुंच भी देता है। यह अनुप्रयोग वातावरण के बारे में वैश्विक जानकारी के लिए इंटरफ़ेस है।

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

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


4

यदि आप Android में अन्य परिचित वर्गों के साथ संदर्भ कनेक्ट करना चाहते हैं , तो इस संरचना को ध्यान में रखें:

प्रसंग <प्रसंगवक्ता <अनुप्रयोग

संदर्भ <ContextWrapper <ContextThemeWrapper <गतिविधि

प्रसंग <संदर्भ

प्रसंग <प्रसंगवक्ता <सेवा

प्रसंग <प्रसंगवक्ता <सेवा <आशय सेवा

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

मैं यहाँ संदर्भों में अंतर समझाता हूँ ।


4

सरल, Androids डाल रहा है Context एक गड़बड़ है जिसे आप तब तक प्यार नहीं करेंगे जब तक आप इसके बारे में चिंता करना बंद नहीं करते।

Android Contexts हैं:

  • ईश्वर-वस्तुओं।

  • यह सोचते हुए कि आप अपने सभी एप्लिकेशन को तब पास करना चाहते हैं जब आप एंड्रॉइड के लिए विकसित करना शुरू कर रहे हैं, लेकिन जब आप प्रोग्रामिंग, परीक्षण और एंड्रॉइड से थोड़ा सा करीब हो जाएंगे, तो इसे करने से बचें।

    • अस्पष्ट निर्भरता।

    • स्मृति लीक का सामान्य स्रोत।

    • परीक्षण के लिए पी.टी.ए.

  • एंड्रॉइड सिस्टम द्वारा अनुमतियों, संसाधनों, वरीयताओं, सेवाओं, प्रसारण, शैली, संवाद दिखाने और लेआउट को प्रदर्शित करने के लिए वास्तविक संदर्भ का उपयोग किया जाता है। और आपको Contextकुछ अलग चीजों के लिए अलग- अलग उदाहरणों की आवश्यकता होती है (जाहिर है, आप किसी एप्लिकेशन या सेवा के संदर्भ से संवाद नहीं दिखा सकते हैं; एप्लिकेशन और गतिविधि संदर्भों से फुलाए गए लेआउट भिन्न हो सकते हैं)।


4

संदर्भ प्रत्येक ऐप-एस सैंडबॉक्स के लिए एंड्रॉइड विशिष्ट एपी है जो संसाधनों, डेटाबेस, निजी फाइलरों, प्राथमिकताओं, सेटिंग्स जैसे एक्सेस ऐप निजी डेटा प्रदान करता है ...

अधिकांश निजीकृत एक आवेदन की सभी गतिविधियों / सेवाओं / प्रसारण सूची के लिए समान हैं।

चूंकि एप्लिकेशन, गतिविधि, सेवा प्रसंग इंटरफ़ेस को लागू करते हैं, उनका उपयोग किया जा सकता है जहां एक एपीआई कॉल को एक संदर्भ पैरामीटर की आवश्यकता होती है


4

Contextविभिन्न समयावधि में घटक (या अनुप्रयोग) का अर्थ है। अगर मैं 1 से 2 बजे के बीच इतना खाना खा लेता हूं तो उस समय के मेरे संदर्भ का उपयोग उन सभी तरीकों (या संसाधनों) तक पहुंचने के लिए किया जाता है जो मैं उस समय के दौरान उपयोग करता हूं। सामग्री विशेष समय के लिए एक घटक (अनुप्रयोग) है। Contextघटकों या अनुप्रयोग के अंतर्निहित जीवनचक्र के आधार पर अनुप्रयोग के घटक बदलते रहते हैं। उदाहरण के लिए, एक की OnCreate () के अंदर Activity,

getBaseContext()- गतिविधि के निर्माता द्वारा सेट (बनाया) contextका वह देता है ActivitygetApplicationContext()- देता हैContext एप्लिकेशन के निर्माण के दौरान सेटअप (बनाया) ।

नोट: <application>सभी Android घटक रखती है।

<application>
    <activity> .. </activity> 

    <service>  .. </service>

    <receiver> .. </receiver>

    <provider> .. </provider>
</application> 

इसका मतलब है, जब आप getApplicationContext()किसी भी घटक के अंदर से कॉल करते हैं, तो आप पूरे एप्लिकेशन के सामान्य संदर्भ को कॉल कर रहे हैं।

Context घटकों के जीवनचक्र पर आधारित प्रणाली द्वारा संशोधित किया जा रहा है।


1

विभिन्न संसाधनों के साथ एक बॉक्स के रूप में संदर्भ के बारे में सोचो: स्ट्रिंग, रंग और फोंट। यदि आपको एक संसाधन की आवश्यकता है, तो आप इस बॉक्स को चालू करते हैं। जब आप स्क्रीन को घुमाते हैं, तो यह बॉक्स बदलता है क्योंकि ओरिएंटेशन परिदृश्य में बदलता है।


0

 Contextवर्तमान का मतलब है। Contextवर्तमान स्क्रीन के लिए ऑपरेशन करने के लिए उपयोग करें। पूर्व।
  1. getApplicationContext ()
  2. getContext ()

Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();

0

महान स्पष्टीकरण! उपरोक्त सभी को पूरक करने के लिए, मैंने इसे माइंडऑक्स से बहुत उपयोगी पाया, यहां तक ​​कि आपके दिमाग को जाने के लिए कुछ बुनियादी उपयोग के मामलों को भी दिखाया गया है:

Android एप्लिकेशन में संदर्भ को समझना


-7

जावा में, हम कहते हैं कि यह कीवर्ड एप्लिकेशन के वर्तमान ऑब्जेक्ट की स्थिति को संदर्भित करता है।
इसी तरह, एक वैकल्पिक में हमारे पास हैContext Android विकास है।

इसे या तो स्पष्ट या स्पष्ट रूप से परिभाषित किया जा सकता है,

Context con = this;

getApplicationContext();

getBaseContext();

getContext();

मुझे लगता है कि वर्तमान गतिविधि का सिर्फ उद्देश्य हो सकता है। मैं इसका इस्तेमाल ऐसे करता हूं जैसे कि यह कुछ समय था।
ओहियोवर

1
संदर्भ प्राप्त करने के लिए कई तरह के तरीके हैं। कॉलिंग thisकेवल गतिविधियों में काम करता है। संदर्भ "यह" का संदर्भ नहीं है - संदर्भ का उपयोग सिस्टम सुविधाओं तक पहुंचने के लिए किया जाता है, और बहुत कुछ। आप संदर्भ को सरल बना रहे हैं और इसके साथ मुख्य बिंदु को याद नहीं कर रहे हैं।
झो

-10

यह विशेषता बताती है कि यह लेआउट डिफ़ॉल्ट रूप से किस गतिविधि से जुड़ा है ।

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