super.onCreate (storedInstanceState);

89

Saya telah membuat Proyek Aplikasi Android dan di MainActivity.java> onCreate()itu memanggil super.onCreate(savedInstanceState).

Sebagai pemula, adakah yang bisa menjelaskan apa tujuan baris di atas?

Pramod
sumber

Jawaban:

161

Setiap Aktivitas yang Anda lakukan dimulai melalui urutan panggilan metode. onCreate()adalah yang pertama dari panggilan ini.

Masing-masing dan setiap Aktivitas Anda meluas android.app.Activitybaik secara langsung atau dengan mensubkelas subkelas lain dari Activity.

Di Java, saat Anda mewarisi dari kelas, Anda bisa mengganti metodenya untuk menjalankan kode Anda sendiri di dalamnya. Contoh yang sangat umum dari ini adalah penggantian toString()metode saat memperluas java.lang.Object.

Saat kita mengganti metode, kita memiliki opsi untuk mengganti sepenuhnya metode di kelas kita, atau memperluas metode kelas induk yang ada. Dengan memanggil super.onCreate(savedInstanceState);, Anda memberi tahu VM Dalvik untuk menjalankan kode Anda selain kode yang ada di onCreate () kelas induk. Jika Anda meninggalkan baris ini, maka hanya kode Anda yang dijalankan. Kode yang ada diabaikan sepenuhnya.

Namun, Anda harus menyertakan panggilan super ini dalam metode Anda, karena jika tidak maka onCreate()kode dalam Activitytidak pernah berjalan, dan aplikasi Anda akan mengalami semua jenis masalah seperti tidak memiliki Konteks yang ditetapkan ke Aktivitas (meskipun Anda akan menekan a SuperNotCalledExceptionsebelum Anda memiliki kesempatan untuk mengetahui bahwa Anda tidak memiliki konteks).

Singkatnya, kelas Android sendiri bisa sangat kompleks. Kode dalam kelas framework menangani hal-hal seperti menggambar UI, membersihkan rumah, serta memelihara Aktivitas dan siklus hidup aplikasi. superpanggilan memungkinkan pengembang untuk menjalankan kode kompleks ini di belakang layar, sambil tetap memberikan tingkat abstraksi yang baik untuk aplikasi kita sendiri.

Raghav Sood
sumber
2
satu pertanyaan lagi - ketika kita mengganti metode kelas induk maka apakah metode turunan ini masih menyimpan kode metode kelas induk, atau itu adalah metode segar yang baru?
Pramod
15
Jika Anda memanggil super, kode metode induk diletakkan di tempat panggilan super berada. Jika super tidak disebut, itu adalah metode baru.
Raghav Sood
2
Raghav Sood, saya pikir Anda harus menambahkan teks komentar Anda ke jawaban karena menjelaskan penggunaan metode super lebih mudah dimengerti untuk pemula. Setidaknya saya memahaminya hanya dari komentar Anda :)
Ayaz Alifov
5

* onCreate(bundle)Metode kelas yang diturunkan harus memanggil implementasi superclass dari metode ini. Ini akan memunculkan pengecualian SuperNotCalledException jika kata kunci " super " tidak digunakan.

Untuk pewarisan dalam Java, untuk mengganti metode superclass dan juga untuk mengeksekusi metode kelas di atas, gunakan super.methodname()metode kelas turunan yang menimpa;

Kelas Android bekerja dengan cara yang sama. Dengan memperluas Activitykelas yang memiliki onCreate(Bundle bundle)metode di mana kode bermakna ditulis dan untuk mengeksekusi kode itu dalam aktivitas yang ditentukan, gunakan kata kunci super dengan metode onCreate () seperti super.onCreate(bundle).

Ini adalah kode yang ditulis dalam onCreate()metode kelas Aktivitas dan tim Android Dev mungkin menambahkan beberapa kode yang lebih bermakna ke metode ini nanti. Jadi, untuk mencerminkan penambahan, Anda harus memanggil super.onCreate () di Activitykelas Anda .

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.
 */

Itu juga mempertahankan variabel mCalledyang berarti Anda telah memanggil super.onCreate(savedBundleInstance)dalam Aktivitas Anda.

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

Lihat kode sumber di sini.

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

Ajay S
sumber
1

Karena pada super.onCreate () itu akan mencapai kelas Activity (kelas induk dari aktivitas apa pun) untuk memuat disimpanInstanceState, dan kita biasanya tidak menyetel status instance tersimpan apa pun, tetapi framework android membuatnya sedemikian rupa sehingga, kita harus memanggil bahwa.

Pemerintah
sumber
Kode Anda akan terkompilasi dengan senang hati bahkan jika Anda tidak menelepon super.onCreate(savedInstanceState), kecuali Anda memiliki kesalahan lain di dalamnya
Raghav Sood
1

Ini adalah informasi yang ingin Anda kembalikan ke aplikasi Anda, melalui onCreate (), jika aktivitas dimusnahkan dan dimulai ulang karena beberapa alasan implisit (misalnya, bukan karena pengguna menekan tombol kembali). Penggunaan onSaveInstanceState () yang paling umum adalah untuk menangani rotasi layar, karena secara default, aktivitas dimusnahkan dan dibuat ulang saat pengguna menggeser keyboard G1.

Alasan untuk memanggil super.onCreate (storedInstanceState) adalah karena kode Anda tidak akan dikompilasi sebaliknya. ;-)

M_ Fa
sumber