super.onCreate (SavedInstanceState);


89

Bir Android Uygulama Projesi oluşturdum ve MainActivity.java'da> onCreate()arıyor super.onCreate(savedInstanceState).

Yeni başlayan biri olarak, yukarıdaki satırın amacının ne olduğunu kimse açıklayabilir mi?

Yanıtlar:


161

Yaptığınız her Aktivite, bir dizi yöntem çağrısı ile başlatılır. onCreate()bu aramaların ilkidir.

Etkinliklerinizin her biri android.app.Activityya doğrudan ya da başka bir alt sınıfını alt sınıflayarak genişler Activity.

Java'da, bir sınıftan miras aldığınızda, içinde kendi kodunuzu çalıştırmak için onun yöntemlerini geçersiz kılabilirsiniz. Bunun çok yaygın bir örneği, toString()genişletme sırasında yöntemin geçersiz kılınmasıdır java.lang.Object.

Bir yöntemi geçersiz kıldığımızda, sınıfımızdaki yöntemi tamamen değiştirme veya mevcut üst sınıf 'yöntemini genişletme seçeneğimiz vardır. Çağrı olarak super.onCreate(savedInstanceState);, kodunuzu çalıştırmak için Dalvik VM anlatmak ek olarak ebeveyn sınıfının onCreate () mevcut koda. Bu satırı dışarıda bırakırsanız, yalnızca kodunuz çalıştırılır. Mevcut kod tamamen yok sayılır.

Ancak, bu süper çağrıyı yönteminize dahil etmelisiniz, çünkü yapmazsanız onCreate()kod Activityasla çalıştırılmaz ve uygulamanız Aktiviteye herhangi bir Bağlam atanmamış gibi her türlü problemle karşılaşır (yine de bir SuperNotCalledExceptionbağlamınız olmadığını anlama şansınız olmadan önce).

Kısacası, Android'in kendi sınıfları inanılmaz derecede karmaşık olabilir. Çerçeve sınıflarındaki kod, kullanıcı arayüzü çizimi, ev temizliği ve Aktivite ve uygulama yaşam döngülerinin bakımı gibi şeyleri işler. superÇağrılar, geliştiricilerin bu karmaşık kodu arka planda çalıştırmalarına olanak tanırken kendi uygulamalarımız için iyi bir soyutlama düzeyi sağlamaya devam ediyor.


2
bir soru daha - ana sınıf yöntemini geçersiz kıldığımızda, bu türetilmiş yöntem hala ana sınıf yönteminin kodunu tutuyor mu yoksa yeni bir yöntem mi?
Pramod

15
Süper'i çağırırsanız, ana yöntemin kodu süper çağrının olduğu yere konur. Süper çağrılmazsa yeni bir yöntemdir.
Raghav Sood

2
Raghav Sood, süper yöntemin kullanımını yeni başlayanlar için daha anlaşılır bir şekilde açıkladığı için cevaba yorum metninizi eklemeniz gerektiğini düşünüyorum. En azından sadece yorumunuzdan anladım :)
Ayaz Alifov

5

* Türetilmiş sınıf onCreate(bundle)yöntemi, bu yöntemin üst sınıf uygulamasını çağırmalıdır. " Super " anahtar sözcüğü kullanılmazsa, SuperNotCalledException bir istisna oluşturur .

Kalıtım için Java, üst sınıf yöntemini geçersiz kılmak ve ayrıca yukarıdaki sınıf yöntemini çalıştırmak için super.methodname(), geçersiz kılma türetilmiş sınıf yöntemini kullanın;

Android sınıfı da aynı şekilde çalışır. Anlamlı kodun yazıldığı yönteme Activitysahip sınıfı genişleterek ve onCreate(Bundle bundle)bu kodu tanımlanan etkinlikte yürütmek için, onCreate () gibi yöntemle super anahtar sözcüğünü kullanın super.onCreate(bundle).

Bu, Activity sınıfı onCreate()yönteminde yazılan bir koddur ve Android Dev ekibi daha sonra bu yönteme daha anlamlı kodlar ekleyebilir. Yani, eklemeleri yansıtmak için sınıfınızdaki super.onCreate () ' i çağırmanız gerekir 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.
 */

Aynı zamanda , Aktivitenizde mCalledçağırdığınız anlamına gelen değişkeni de korur 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()");
    }
}

Kaynak koduna buradan bakın.

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

Çünkü super.onCreate () üzerine, SavedInstanceState'i yüklemek için Activity (herhangi bir aktivitenin üst sınıfı) sınıfına ulaşacaktır ve normalde kaydedilmiş herhangi bir örnek durumu ayarlamıyoruz, ancak android çerçevesi öyle bir şekilde yaptı ki, çağırmalıyız bu.


super.onCreate(savedInstanceState)Başka bir
hatanız

1

Etkinlik bazı örtük nedenlerle (örneğin, kullanıcı geri düğmesine basmadığı için) yok edilirse ve yeniden başlatılırsa, onCreate () aracılığıyla uygulamanıza döndürülmesini istediğiniz bilgilerdir. OnSaveInstanceState () öğesinin en yaygın kullanımı, varsayılan olarak, kullanıcı G1 klavyesini kaydırdığında etkinlikler yok edilip yeniden oluşturulduğu için ekran dönüşlerini işlemektir.

Super.onCreate (SavedInstanceState) 'i çağırmanın nedeni, kodunuzun başka türlü derlenmemesidir. ;-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.