Android - Activity Constructor vs onCreate


89

Android'in Activitiesbelirli yaşam döngüleri olduğunu ve bunun onCreategeçersiz kılınması ve başlatma için kullanılması gerektiğini anlıyorum , ancak kurucuda tam olarak ne oluyor? Yapıcıyı da geçersiz kılabileceğiniz / yazmanız gereken durumlar var mı Activity, yoksa ona asla dokunmamalı mısınız?

Yapıcının hiçbir zaman kullanılmaması gerektiğini varsayıyorum, çünkü referanslar Activitiestamamen temizlenmez (bu nedenle çöp toplayıcıyı engeller) ve onDestroybu amaç için oradadır. Bu doğru mu?


2
Android'in Aktivitenizi herhangi bir zamanda yok edebileceği / yeniden oluşturabileceği gerçeğine ne dersiniz? O zaman kurucunun çağrılıp çağrılmayacağını ve hatta - hangi kurucu çağrılacağını bilmiyorsunuz ... (aynısı Parçalar için de geçerlidir ve bu nedenle her Parçanın boş bir varsayılan kurucu uygulaması gerekir).
Marian Paździoch

Yanıtlar:


34

Yapıcıda bir şey yapmak için iyi bir neden düşünemiyorum. Hiçbir zaman doğrudan bir etkinlik oluşturmazsınız, bu nedenle parametreleri aktarmak için kullanamazsınız. Genellikle onCreate'te bir şeyler yapın.


75
onCreate (), son alanları kullanmanızı engeller.
Gili

2
Ancak OnCreate yalnızca bir kez çağrılmıyor, yanılıyor muyum? Ekran yönünü değiştirip elimden geri döndüğümde, etkinlik her yeniden
yüklendiğinde

2
@fercis onCreate, inandığım her örnek için yalnızca bir kez çağrılıyor. Cihazı döndürürken, bu Activity örneği yok edilir ve onCreate'i çağırarak yeni bir tane oluşturulur. Bununla birlikte, onCreate'de son alanları örnekleyemeyeceğinizden oldukça eminim çünkü Java onCreate'in yalnızca bir kez çağrılacağını bilmiyor (ve gerçekten, kodunuzda tekrar kendiniz de adlandırabilirsiniz - kötü şeyler olacak, ancak yine de derlenecektir) ve bu nedenle son alanları başlatmanın tek yolu yapıcıdır.
Harvey Adcock

OnCreate olayı tam olarak ne zaman çalışmaya başlar? OnCreate olayının başlangıcında bir kesme noktası belirlediğimde, uygulama çalışacak ve etkinliği ekrana yükleyecek, ardından kesme noktası etkinleşecek ve uygulama duraklayacak. Etkinlik başlatılmadan ve başlatılmadan önce tam olarak etkinleşen etkinlik hakkında bir etkinliğe ihtiyacım var.
Mohammad Afrashteh

@Cheryl Simon, asla doğrudan bir aktivite yaratmadığınızı söylediniz, o zaman etkinliği kim yaratıyor?
Sreekanth Karumanaghat

7

Gili'nin yorumunun belirttiği gibi kurucuya bir şeyler koymak için iyi bir neden, son alanların kullanılmasıdır.

Bununla birlikte, yapıcıdaki şeyleri başlatırsanız, nesnenin ömrü biraz daha uzun olacaktır, ancak çok düşünmüyorum çünkü onCreatekısa süre sonra çağrılacaktı.

Benim ideali aykırı olsa da, ben etkinlik üyelerinin başlatma için yapıcı önlemek ve itimat yok onResume()ve onPause()benim app ele aldığı kaynaklar için.

Çünkü onCreate()bunu genellikle yerel değişkenlere görünüm eşlemesi yapmak için kullanırım. Android notları bunu benim için zaten yapıyor olsa da, nadiren onCreate()Aktivitem için bir yöntemim oluyor. Yine de onu Hizmette kullanıyorum.

Ancak üyelere bakarsanız, başlatıyor olabilirsiniz.

  • uygun zamanda (onResume veya onPause) çağırmanız gereken "close" bir yöntemi olacaktır.

  • görünümün bir parçası olurlar, yani başlatılması ve onCreate'in çağrılması gerektiği anlamına gelir

  • onlar zaten kurucuya konulması gerekmeyen sabitlerdir, sadece statik bir son iş görür. Bu, statik bir blokla başlatılabilen Paint ve Yol sabitlerini içerir


1
Nesnenin ömrü biraz daha uzun olacak ne demek? Ben ne şekilde Örneğin, bu başlangıçları onCreate'e taşıdıysanız, bu yine de aynı zaman alır. Yaşam süresinde belirleyebileceğim hiçbir fark yok. Bu konuyu biraz daha açabilir misiniz, lütfen hissettiğim gibi, göreceli bir yeni gelen olarak, burada çok önemli bir şeyi kaçırıyor olabilirim.
RichieHH

2
Arşimet daha uzun olan @RichieHH sadece kurucunun onCreate () 'den önce çağrıldığını ve böylece orada ne yapılırsa
yapılsın

6

Şimdi kurucuyu geçersiz kılması gereken bir durumdayım. Aslında aynı yapıya sahip bazı faaliyetlerim var. Yani birçok aktivite yaratmak yerine, bir "Master" aktivite yaratacağım ve diğerleri bunu miras alacak. Bu nedenle, oncreate yöntemlerinde kullanılacak bazı değişkenleri başlatabilmek için çocuk etkinliğinin yapıcısını geçersiz kılmam gerekiyor.

İki kelimeyle, kurucu, kalıtım yoluyla yeniden kullanılabilecek bir "ustalık" simülasyonu yapmanızı sağlar!


15
Bunun eski olduğunu biliyorum, ancak burada süper alan somutlaştırmasını onCreate () uygulamasına kıyasla faydası nedir? Yine de çocuktan super.onCreate () 'i arayacaksınız.
Andrew G

Dolayısıyla, etkinliği başlatırken yalnızca farklı Değerleri aynı ANAHTAR'a aktararak ve böylece aynı Etkinliği kullanarak, alınan değere bağlı olarak Etkinlik'te neyin gösterileceğini belirleyebilirsiniz. Müteahhitler için gitmenizin özel nedeni nedir? Veya Aktivitenin değişmeyen kısmını ortak tutarak ve değişen kısmın geri kalanı için Parçalar yaratabilirdiniz.
Nayanesh Gupte

0

Etkinliğinizin özel parametreleri olduğunda veya miras alınan sınıflardan gelen çağrıları izlemek istediğinizde Oluşturucuyu geçersiz kılmanız gerekir.


1
Bunu biraz daha detaylandırır mısınız? Tanımladığınız şey kulağa ilginç geliyor, ancak biraz belirsiz. Teşekkürler!
idolize

3
2 veya daha fazla parametre alan özel bir Activity sınıfı oluşturmanız gerektiğini varsayalım. Yapıcıyı kullanmanız yeterlidir, bunu onCreate ve ekstralar aracılığıyla yapamazsınız. Yardımcı olur mu?
Pentium10

1
Özel birine ihtiyacım olabilir. Örneğin özelleştirilmiş bir kişi seçici gibi özel bir bileşen oluşturmak istediğimi varsayalım. Sahip olmak için startActivityForResultbu etkinliği başlattı ve hiçbir visibile öğesi vardır asla bile, benim özel bileşeninde özel yapıcı içermelidir, ben sadece bunun sonucu şeyler için kullanırlar.
Pentium10

6
Bunun bana @Pentium gibi bir kod örneği olmadan mantıklı gelmediğini söyleyeceğim.
Blundell

Yapıcı aracılığıyla bir şeyler yapmanın bir avantajı, miras alınan bir sınıfın yararlanabileceği parametreleri alabilen bir "şablon" etkinliğine sahip olmaktır. Örneğin, R.id.cameraSurface, R.id.videoSurface gibi sadece bazı özelliklerde farklılık gösteren iki etkinliğiniz varsa, o zaman bir parametreyi alacak bir kurucu oluşturabilir ve buna AbstractResourceActivity adını verirsiniz ve ardından, kayıtlı CameraActivity'ye sahip olursunuz. Kaynak kimliğinde geçen AbstractResourceActivity'yi genişleten bildirimde.
Arşimet Trajano
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.