super.onCreate (savedInstanceState);


88

मैंने एक Android Application Project बनाया है और MainActivity.java> में onCreate()यह कॉलिंग है super.onCreate(savedInstanceState)

एक शुरुआत के रूप में, क्या कोई समझा सकता है कि उपरोक्त लाइन का उद्देश्य क्या है?

जवाबों:


159

आपके द्वारा की जाने वाली प्रत्येक गतिविधि को विधि कॉल के अनुक्रम के माध्यम से शुरू किया जाता है। onCreate()इनमें से पहला कॉल है।

आपकी प्रत्येक गतिविधि प्रत्येक android.app.Activityया तो सीधे या किसी अन्य उपवर्ग को जोड़कर फैली हुई है Activity

जावा में, जब आप एक वर्ग से वारिस होते हैं, तो आप अपने कोड को उन में चलाने के लिए उसके तरीकों को ओवरराइड कर सकते हैं। इसका एक बहुत ही सामान्य उदाहरण है कि इस toString()पद्धति का व्यापक रूप से विस्तार हो रहा है java.lang.Object

जब हम किसी विधि को ओवरराइड करते हैं, तो हमारे पास अपनी कक्षा में विधि को पूरी तरह से बदलने का विकल्प होता है, या मौजूदा अभिभावक वर्ग की विधि का विस्तार करने का। कॉल करके super.onCreate(savedInstanceState);, आप दलविक VM को मूल कोड के onCreate () में मौजूदा कोड के अलावा अपना कोड चलाने के लिए कहते हैं । यदि आप इस लाइन को छोड़ देते हैं, तो केवल आपका कोड चलाया जाता है। मौजूदा कोड को पूरी तरह से नजरअंदाज कर दिया गया है।

हालाँकि, आपको इस सुपर कॉल को अपनी विधि में शामिल करना होगा, क्योंकि यदि आप नहीं करते हैं, तो onCreate()कोड Activityकभी भी चालू नहीं होता है, और आपका ऐप सभी प्रकार की समस्या में चलेगा जैसे कि कोई भी गतिविधि को सौंपा नहीं गया है (हालाँकि आप हिट करेंगे। एक SuperNotCalledExceptionआप इससे पहले कि आप कोई संदर्भ है कि यह पता लगाने की) का मौका है।

संक्षेप में, एंड्रॉइड की अपनी कक्षाएं अविश्वसनीय रूप से जटिल हो सकती हैं। फ्रेमवर्क कक्षाओं में कोड UI ड्राइंग, घर की सफाई और गतिविधि और एप्लिकेशन जीवन चक्र को बनाए रखने जैसे सामान को संभालता है। superकॉल डेवलपर्स को इस जटिल कोड को पर्दे के पीछे चलाने की अनुमति देते हैं, जबकि अभी भी हमारे खुद के ऐप के लिए एक अच्छा स्तर प्रदान करते हैं।


2
एक और सवाल - जब हम अभिभावक वर्ग विधि को ओवरराइड करते हैं तो क्या यह व्युत्पन्न विधि अभी भी अभिभावक वर्ग विधि का कोड रखती है, या यह एक नई ताजा विधि है?
प्रमोद

15
यदि आप सुपर कॉल करते हैं, तो पेरेंट मेथड का कोड वहां रखा जाता है, जहां सुपर कॉल होती है। यदि सुपर नहीं कहा जाता है, तो यह एक ताजा विधि है।
राघव सूद

2
राघव सूद, मुझे लगता है कि आपको अपना टिप्पणी पाठ उत्तर में जोड़ना चाहिए क्योंकि यह शुरुआती लोगों के लिए सुपर विधि के उपयोग को अधिक स्पष्ट रूप से बताता है। कम से कम मैंने इसे आपकी टिप्पणी से ही समझा :)
अयाज अलिफोव

5

* व्युत्पन्न वर्ग onCreate(bundle)विधि को इस पद्धति का सुपरक्लास कार्यान्वयन कहा जाना चाहिए। यह एक अपवाद SuperNotCalledException फेंक देगा अगर " सुपर " कीवर्ड का उपयोग नहीं किया जाता है ।

इनहेरिटेंस के लिए Java, सुपरक्लास पद्धति को ओवरराइड करने के लिए और उपरोक्त क्लास पद्धति को निष्पादित करने के लिए भी, उपयोग करेंsuper.methodname() ओवरराइडिंग क्लास विधि का उपयोग करें;

एंड्रॉइड क्लास उसी तरह से काम करता है। जिस Activityक्लास में जिस onCreate(Bundle bundle)विधि में सार्थक कोड लिखा गया है, उसे बढ़ाकर और परिभाषित गतिविधि में उस कोड को निष्पादित करने के लिए, ऑन-क्रिएट विधि के साथ सुपर कीवर्ड का उपयोग करें (जैसे)super.onCreate(bundle)

यह गतिविधि वर्ग onCreate()विधि में लिखा गया एक कोड है और Android देव टीम बाद में इस विधि में कुछ और सार्थक कोड जोड़ सकती है। इसलिए, परिवर्धन को प्रतिबिंबित करने के लिए, आपको अपनी कक्षा में super.onCreate () को कॉल करना चाहिए Activity

protected void  onCreate(Bundle savedInstanceState) {
    mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
    com.android.internal.R.styleable.Window_windowNoDisplay, true);
    mCalled = true;
}

boolean mVisibleFromClient = true;

/**
 * Controls whether this activity main window is visible.  This is intended
 * only for the special case of an activity that is not going to show a
 * UI itself, but can't just finish prior to onResume() because it needs
 * to wait for a service binding or such.  Setting this to false prevents the UI from being shown during that time.
 * 
 * <p>The default value for this is taken from the
 * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
 */

यह उस चर को भी बनाए रखता है mCalledजिसका अर्थ है कि आपने super.onCreate(savedBundleInstance)अपनी गतिविधि में बुलाया है ।

final void performStart() {
    mCalled = false;
    mInstrumentation.callActivityOnStart(this);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onStart()");
    }
}

स्रोत कोड यहां देखें

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/app/Activity.java#Activity.onCreate%28android.os.Bundle%29


1

क्योंकि super.onCreate () पर यह सहेजी गई गतिविधि को लोड करने के लिए गतिविधि (किसी भी गतिविधि का मूल वर्ग) वर्ग तक पहुंच जाएगा, और हम सामान्य रूप से किसी भी सहेजे गए इंस्टेंस राज्य को सेट नहीं करते हैं, लेकिन एंड्रॉइड फ्रेमवर्क ने इस तरह से बनाया है कि, हमें कॉल करना चाहिए उस।


super.onCreate(savedInstanceState)जब तक आप कॉल नहीं करेंगे तब तक आपका कोड खुशी से संकलित करेगा , जब तक कि आपको इसमें कुछ और त्रुटि न हो
राघव सूद

1

यह वह जानकारी है जिसे आप अपने आवेदन पर लौटना चाहते हैं, onCreate () के माध्यम से, यदि गतिविधि को नष्ट कर दिया गया है और कुछ निहित कारण (जैसे, इसलिए नहीं कि उपयोगकर्ता ने बैक बटन दबाया) के कारण फिर से चालू हो जाए। OnSaveInstanceState () का सबसे आम उपयोग स्क्रीन घुमाव को संभालने के लिए है, क्योंकि डिफ़ॉल्ट रूप से, गतिविधियां तब नष्ट हो जाती हैं और जब उपयोगकर्ता G1 कीबोर्ड से बाहर निकलते हैं तो उन्हें फिर से बनाया जाता है।

Super.onCreate (saveInstanceState) को कॉल करने का कारण यह है कि आपका कोड अन्यथा संकलित नहीं होगा। ;-)

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