Android - Activity Constructor gegen onCreate

87

Ich verstehe, dass Android Activitiesbestimmte Lebenszyklen hat und onCreatediese überschrieben und für die Initialisierung verwendet werden sollten, aber was genau passiert im Konstruktor? Gibt es Fälle, in denen Sie den ActivityKonstruktor ebenfalls überschreiben könnten / sollten oder ihn niemals berühren sollten?

Ich gehe davon aus, dass der Konstruktor niemals verwendet werden sollte, da Verweise auf Activitiesnicht vollständig bereinigt werden (was den Garbage Collector behindert) und das onDestroyzu diesem Zweck vorhanden ist. Ist das richtig?

vergöttern
quelle
2
Was ist mit der Tatsache, dass Android Ihre Aktivität jederzeit zerstören / neu erstellen kann? Sie wissen nicht, ob der Konstruktor dann aufgerufen wird und selbst wenn - welcher Konstruktor aufgerufen wird ... (Gleiches gilt für Fragmente, weshalb jedes Fragment einen leeren Standardkonstruktor implementieren muss).
Marian Paździoch

Antworten:

34

Ich kann mir keinen guten Grund vorstellen, irgendetwas im Konstruktor zu tun. Sie erstellen eine Aktivität niemals direkt, sodass Sie sie nicht zum Übergeben von Parametern verwenden können. Im Allgemeinen erledigen Sie die Dinge einfach in onCreate.

Cheryl Simon
quelle
73
onCreate () verhindert, dass Sie endgültige Felder verwenden.
Gili
2
Aber OnCreate wird nicht nur einmal aufgerufen, irre ich mich? Wenn ich die Bildschirmausrichtung und zurück von meiner Hand ändere, wird jedes Mal, wenn die Aktivität neu geladen wird, oncreate aufgerufen
fercis
2
@fercis onCreate wird meiner Meinung nach nur einmal pro Instanz aufgerufen. Beim Drehen des Geräts wird diese Instanz der Aktivität zerstört und eine neue erstellt, die onCreate aufruft. Trotzdem bin ich mir ziemlich sicher, dass Sie die endgültigen Felder in onCreate nicht instanziieren können, da Java nicht weiß, dass onCreate nur einmal aufgerufen wird (und Sie es in Ihrem Code sogar selbst erneut aufrufen können - schlimme Dinge werden passieren, aber es wird immer noch kompiliert) und so wäre die einzige Möglichkeit, endgültige Felder zu instanziieren, der Konstruktor.
Harvey Adcock
Wann wird das OnCreate-Ereignis genau ausgeführt? Wenn ich zu Beginn des OnCreate-Ereignisses einen Haltepunkt festlege, damit die App ausgeführt und die Aktivität auf den Bildschirm geladen wird, wird der Haltepunkt aktiviert und die App wird angehalten. Ich benötige ein Ereignis über die Aktivität, das genau vor der Initialisierung und dem Start der Aktivität aktiviert wird.
Mohammad Afrashteh
@Cheryl Simon, Sie haben gesagt, dass Sie niemals eine Aktivität direkt erstellen. Wer erstellt dann die Aktivität?
Sreekanth Karumanaghat
7

Ein guter Grund, Dinge in den Konstruktor zu setzen, wie Gilis Kommentar angegeben hatte, ist die Verwendung von Endfeldern.

Wenn Sie jedoch Dinge im Konstruktor initialisieren, wird die Lebensdauer des Objekts etwas länger sein, obwohl ich nicht viel darüber nachdenke, da das onCreatekurz danach aufgerufen werden würde.

Obwohl dies gegen mein Ideal verstößt, vermeide ich den Konstruktor für die Initialisierung der Aktivitätsmitglieder und verlasse mich auf onResume()und onPause()für Ressourcen, mit denen meine App zu tun hat.

Für onCreate()Ich benutze es in der Regel Ansicht Mapping auf lokale Variablen zu tun. Obwohl Android-Annotations dies bereits für mich tun, habe ich selten eine onCreate()Methode für meine Aktivität. Ich benutze es trotzdem im Service.

Wenn Sie sich jedoch die Mitglieder ansehen, werden Sie möglicherweise initialisiert

  • Sie hätten eine "close" -Methode, die Sie zum richtigen Zeitpunkt aufrufen müssen (onResume oder onPause).

  • Sie sind Teil der Ansicht, dh sie muss initialisiert und dann onCreate aufgerufen werden

  • Es sind Konstanten, die sowieso nicht in den Konstruktor eingefügt werden müssen, nur ein statisches Finale würde ausreichen. Dies umfasst Paint- und Path-Konstanten, die von einem statischen Block initialisiert werden können

Archimedes Trajano
quelle
1
Was meinst du damit, dass die Lebensdauer des Objekts etwas länger sein wird? Ich wie? Wenn Sie diese Initialisierungen beispielsweise in onCreate verschoben haben, dauert dies immer noch dieselbe Zeit. Es gibt keinen Unterschied in der Lebensdauer, den ich bestimmen kann. Können Sie das bitte etwas näher erläutern, da ich als relativer Neuling hier möglicherweise etwas Entscheidendes vermisse?
RichieHH
2
@RichieHH von länger Archimedes sagt nur, dass der Konstruktor vor onCreate () aufgerufen wird, und was auch immer dort getan wird, wird (etwas) länger als sonst bestehen bleiben, wenn die Aktivität zerstört wird
pho79
6

Ich bin jetzt in einem Fall, der den Konstruktor überschreiben muss. In der Tat habe ich einige Aktivitäten, die die gleiche Struktur haben. Anstatt viele Aktivitäten zu erstellen, erstelle ich eine "Master" -Aktivität und die anderen erben diese. Daher muss ich den Konstruktor der untergeordneten Aktivität überschreiben, um einige Variablen initialisieren zu können, die in den oncreate-Methoden verwendet werden.

Mit zwei Worten, der Konstruktor lässt Sie eine "Masteraktivität" simulieren, die durch Vererbung wiederverwendet werden kann!

biboMandroid
quelle
15
Ich weiß, dass dies alt ist, aber was ist der Vorteil hier gegenüber der Implementierung der Superfeld-Instanziierung in onCreate (). Sie werden sowieso super.onCreate () vom Kind aufrufen.
Andrew G
Wenn Sie also beim Starten der Aktivität unterschiedliche Werte im Bündel oder in der Absicht an denselben SCHLÜSSEL übergeben und damit dieselbe Aktivität verwenden, können Sie abhängig vom empfangenen Wert bestimmen, was in der Aktivität angezeigt werden soll. Was ist der genaue Grund, warum Sie sich für Construtors entschieden haben? Oder Sie behalten den sich nicht ändernden Teil der Aktivität bei und für den Rest des sich ändernden Teils könnten Sie Fragmente erstellt haben.
Nayanesh Gupte
0

Sie müssen den Konstruktor überschreiben, wenn Ihre Aktivität benutzerdefinierte Parameter enthält oder Sie Aufrufe von Klassen verfolgen möchten, von denen geerbt wurde.

Pentium10
quelle
1
Können Sie das näher erläutern? Was Sie beschreiben, klingt interessant, ist aber etwas vage. Vielen Dank!
vergöttern
3
Angenommen, Sie müssen eine benutzerdefinierte Aktivitätsklasse erstellen, die zwei oder mehr Parameter akzeptiert. Sie müssen nur den Konstruktor verwenden, das können Sie nicht über onCreate und Extras. Hilft es?
Pentium10
1
Es könnte sein, dass ich einen privaten brauche. Angenommen, ich möchte eine benutzerdefinierte Komponente erstellen, z. B. eine benutzerdefinierte Kontaktauswahl. Um dies zu haben, startActivityForResultmuss ich einen privaten Konstruktor in meine benutzerdefinierte Komponente aufnehmen, auch wenn diese Aktivität niemals gestartet wird und keine sichtbaren Elemente enthält, verwende ich nur das Ergebnismaterial.
Pentium10
6
Ich werde sagen, das macht für mich @Pentium keinen Sinn, nicht ohne ein Codebeispiel.
Blundell
Ich denke, ein Vorteil von Dingen über den Konstruktor besteht darin, eine "Vorlagen" -Aktivität zu haben, die Parameter aufnehmen kann, die eine geerbte Klasse nutzen kann. Wenn Sie beispielsweise zwei Aktivitäten haben, die sich nur in einigen Eigenschaften unterscheiden, z. B. R.id.cameraSurface, R.id.videoSurface, können Sie einen Konstruktor erstellen, der einen Parameter namens AbstractResourceActivity übernimmt, und dann haben Sie CameraActivity registriert auf dem Manifest, das AbstractResourceActivity erweitert und die Ressourcen-ID übergibt.
Archimedes Trajano