Android - Pembuat Aktivitas vs onCreate

89

Saya memahami bahwa Android Activitiesmemiliki siklus hidup tertentu dan itu onCreateharus diganti dan digunakan untuk inisialisasi, tetapi apa yang sebenarnya terjadi di konstruktor? Adakah kasus ketika Anda bisa / harus mengganti Activitykonstruktor juga, atau haruskah Anda tidak pernah menyentuhnya?

Saya berasumsi bahwa konstruktor tidak boleh digunakan karena referensi ke Activitiestidak dibersihkan seluruhnya (sehingga menghambat pengumpul sampah) dan itu onDestroyada untuk tujuan itu. Apakah ini benar?

mendewakan
sumber
2
Bagaimana dengan fakta bahwa Android dapat menghancurkan / membuat ulang Aktivitas Anda kapan saja? Anda tidak tahu apakah konstruktor akan dipanggil kemudian dan bahkan jika - konstruktor mana yang akan dipanggil ... (hal yang sama berlaku untuk Fragmen dan inilah mengapa setiap Fragmen harus mengimplementasikan konstruktor default kosong).
Marian Paździoch

Jawaban:

34

Saya tidak bisa memikirkan alasan bagus untuk melakukan apa pun di konstruktor. Anda tidak pernah membuat aktivitas secara langsung, jadi Anda tidak dapat menggunakannya untuk meneruskan parameter. Umumnya, lakukan saja di onCreate.

Cheryl Simon
sumber
75
onCreate () mencegah Anda menggunakan bidang akhir.
Gili
2
Tapi OnCreate tidak dipanggil hanya sekali, apakah saya salah? Ketika saya mengubah orientasi layar dan kembali dengan tangan saya, setiap kali aktivitas dimuat ulang, oncreate dipanggil
fercis
2
@fercis onCreate dipanggil hanya sekali per contoh yang saya percaya. Saat merotasi perangkat, instance Activity tersebut akan dimusnahkan dan yang baru dibuat, memanggil onCreate. Meskipun demikian, saya cukup yakin Anda tidak dapat membuat contoh bidang akhir di onCreate karena Java tidak tahu onCreate hanya akan dipanggil sekali (dan memang, Anda dapat memanggilnya lagi sendiri di kode Anda - hal buruk akan terjadi, tetapi itu akan tetap dikompilasi) sehingga satu-satunya cara untuk membuat contoh bidang akhir adalah di konstruktor.
Harvey Adcock
Kapan acara OnCreate mulai berjalan tepat? Ketika saya menetapkan breakpoint di awal acara OnCreate sehingga aplikasi berjalan dan memuat aktivitas ke layar, kemudian breakpoint diaktifkan dan aplikasi berhenti. Saya membutuhkan acara tentang aktivitas yang aktif tepat sebelum aktivitas diinisialisasi dan diluncurkan.
Mohammad Afrashteh
@Cheryl Simon, Anda bilang jangan pernah membuat aktivitas secara langsung, lalu siapa yang membuat aktivitas?
Sreekanth Karumanaghat
7

Alasan yang baik untuk meletakkan benda-benda di konstruktor seperti yang dinyatakan oleh komentar Gili adalah penggunaan bidang akhir.

Namun, jika Anda menginisialisasi sesuatu di konstruktor, maka umur objek akan sedikit lebih lama, meskipun saya tidak terlalu memikirkannya karena onCreateakan segera dipanggil setelahnya.

Meskipun bertentangan dengan cita-cita saya, saya menghindari konstruktor untuk inisialisasi anggota aktivitas dan mengandalkan onResume()serta onPause()untuk sumber daya yang ditangani aplikasi saya.

Karena onCreate()saya biasanya menggunakannya untuk melakukan pemetaan tampilan ke variabel lokal. Meskipun android-annotations sudah melakukan itu untuk saya, jadi saya jarang memiliki onCreate()metode untuk Aktivitas saya. Saya masih menggunakannya di Layanan sekalipun.

Namun, jika Anda melihat anggota yang mungkin Anda inisialisasi

  • mereka akan memiliki metode "tutup" yang harus Anda panggil pada waktu yang tepat (onResume atau onPause)

  • mereka akan menjadi bagian dari tampilan yang berarti itu perlu diinisialisasi kemudian onCreate perlu dipanggil

  • mereka adalah konstanta yang tidak perlu diletakkan di konstruktor, hanya final statis sudah cukup. Ini termasuk konstanta Paint dan Path yang dapat diinisialisasi dengan blok statis

Archimedes Trajano
sumber
1
Apa maksud Anda umur benda akan sedikit lebih lama? Cara apa Karena jika Anda memindahkan initalisasi ini ke onCreate, misalnya, itu masih membutuhkan waktu yang sama. Tidak ada perbedaan umur yang bisa saya tentukan. Bisakah Anda menjelaskan hal ini sedikit lagi, karena saya merasa, sebagai pendatang baru, saya mungkin melewatkan sesuatu yang penting di sini.
RichieHH
2
@RichieHH oleh Archimedes yang lebih panjang hanya mengatakan bahwa konstruktor dipanggil sebelum onCreate () dan jadi apa pun yang dilakukan di sana akan bertahan (sedikit) lebih lama daripada sebaliknya pada saat aktivitas dimusnahkan
pho79
6

Saya sekarang dalam kasus yang perlu menimpa konstruktor. Sebenarnya, saya memiliki beberapa aktivitas yang memiliki struktur yang sama. Jadi, alih-alih membuat banyak aktivitas, saya akan membuat satu aktivitas "Master" dan yang lainnya akan mewarisi aktivitas ini. Jadi saya perlu mengganti konstruktor aktivitas anak untuk dapat menginisialisasi beberapa variabel yang akan digunakan dalam metode oncreate.

Dalam dua kata, konstruktor membuat Anda mensimulasikan "aktivitas utama" yang dapat digunakan kembali oleh pewarisan!

biboMandroid
sumber
15
Saya tahu ini sudah tua tetapi apa manfaatnya di sini hanya dari menerapkan instansiasi super field di dalamnya onCreate (). Anda akan tetap menelepon super.onCreate () dari anak itu.
Andrew G
Jadi, hanya dengan meneruskan Nilai yang berbeda ke KEY yang sama dalam bundel atau maksud saat meluncurkan aktivitas dan dengan demikian menggunakan Aktivitas yang sama, Anda dapat menentukan apa yang akan ditampilkan dalam Aktivitas bergantung pada nilai yang diterima. Apa alasan spesifik Anda memilih konstrutor? Atau menjaga bagian yang tidak berubah dari Aktivitas tetap umum dan untuk bagian lain yang berubah, Anda dapat membuat Fragmen.
Nayanesh Gupte
0

Anda perlu mengganti Pembuat ketika aktivitas Anda akan memiliki parameter khusus atau Anda ingin melacak panggilan dari kelas yang diwarisi darinya.

Pentium10
sumber
1
Bisakah Anda menjelaskan lebih lanjut tentang ini? Apa yang Anda gambarkan terdengar menarik, tetapi agak kabur. Terima kasih!
mengidolakan
3
Misalkan Anda perlu membuat kelas Aktivitas kustom yang membutuhkan 2 parameter atau lebih. Anda hanya perlu menggunakan Pembuat, Anda tidak dapat melakukannya melalui onCreate dan ekstra. Apakah itu membantu?
Pentium10
1
Mungkin saya perlu yang pribadi. Misalkan saya ingin membuat komponen khusus misalnya pemilih kontak yang disesuaikan. Untuk memilikinya, startActivityForResultsaya harus menyertakan konstruktor privat di komponen kustom saya, meskipun aktivitas itu tidak akan pernah diluncurkan dan tidak memiliki elemen visibile, saya hanya menggunakan for result stuff darinya.
Pentium10
6
Saya akan mengatakan, itu tidak masuk akal bagi saya @Pentium, bukan tanpa contoh kode.
Blundell
Saya rasa satu keuntungan melakukan sesuatu melalui konstruktor adalah memiliki aktivitas "template" yang dapat mengambil parameter yang dapat dimanfaatkan oleh kelas yang diwariskan. Misalnya jika Anda memiliki dua aktivitas yang hanya berbeda pada beberapa propertinya, misalnya R.id.cameraSurface, R.id.videoSurface, maka Anda dapat membuat konstruktor yang akan mengambil parameter menyebutnya AbstractResourceActivity dan kemudian Anda memiliki CameraActivity yang terdaftar pada manifes yang memperluas AbstractResourceActivity dengan meneruskan ID sumber daya.
Archimedes Trajano