2010-07-21 16 views
79

Capisco che Android Activities abbia cicli di vita specifici e che onCreate debba essere sovrascritto e utilizzato per l'inizializzazione, ma cosa succede esattamente nel costruttore? Ci sono casi in cui potresti/dovresti ignorare il costruttore Activity o non dovresti mai toccarlo?Android - Activity Constructor vs onCreate

Suppongo che il costruttore non debba mai essere utilizzato perché i riferimenti a Activities non vengono eliminati completamente (ostacolando quindi il garbage collector) e che onDestroy è lì per tale scopo. È corretto?

+2

Che dire del fatto che Android può distruggere/ricreare la tua attività in qualsiasi momento? Non sai se il costruttore verrà chiamato allora e anche se - quale costruttore sarà chiamato ... (lo stesso vale per Frammenti e questo è il motivo per cui ogni Frammento deve implementare un costruttore predefinito vuoto). –

risposta

31

Non riesco a pensare a nessuna buona ragione per fare qualcosa nel costruttore. Non costruisci mai un'attività direttamente, quindi non puoi usarla per passare i parametri. Generalmente, fai semplicemente le cose su onCreate.

+65

onCreate() ti impedisce di utilizzare i campi finali. – Gili

+6

Test? ' private final InterfaceDep dep; public MyActivity() {dep = new DepImpl(); } MyActivity (InterfaceDep dep) {this.dep = dep; } ... @Mock private InterfaceDep dep; @InjectMocks private MyActivity myActivity; ' – saiyancoder

+1

Ma OnCreate non viene chiamato solo una volta, sbaglio? Quando cambio l'orientamento dello schermo e ritorno per mano, ogni volta che l'attività si ricarica, oncreate si chiama – fercis

1

È necessario eseguire l'override del Costruttore quando la propria attività avrà parametri personalizzati o si desidera tenere traccia delle chiamate dalle classi ereditate da.

+1

Puoi approfondire questo argomento? Ciò che descrivi sembra interessante, ma è un po 'vago. Grazie! – idolize

+3

Supponi di aver bisogno di creare una classe Attività personalizzata che richieda 2 o più parametri. Hai solo bisogno di usare il Costruttore, non puoi farlo tramite onCreate ed extra. Aiuta? – Pentium10

+4

Ma non si creano attività in modo esplicito, si crea un'intenzione ... – idolize

7

Sono ora in un caso che ha bisogno di sovrascrivere il costruttore. In effetti, ho alcune attività che hanno la stessa struttura. Quindi, invece di creare molte attività, creerò un'attività "Master" e le altre erediteranno questa. Quindi ho bisogno di sovrascrivere il costruttore dell'attività figlio per poter inizializzare alcune variabili che verranno utilizzate nei metodi oncreate.

In due parole, il costruttore ti fa simulare una "padronanza" che può essere riutilizzata per ereditarietà!

+14

So che questo è vecchio, ma qual è il vantaggio qui solo implementando l'istanziazione di super campo in esso onCreate(). In ogni caso, chiamerai super.onCreate() dal bambino. –

+0

Quindi, semplicemente passando valori diversi allo stesso KEY in bundle o intent durante l'avvio dell'attività e quindi utilizzando la stessa attività, è possibile determinare cosa mostrare in Activity a seconda del valore ricevuto. Qual è la ragione specifica per cui sei andato per i costruttori? Oppure, mantenendo la parte non modificabile dell'Attività comune e per il resto della parte che cambia, potresti aver creato Frammenti. –

+0

quale si chiama prima. costruttore o oncreate. Penso che il costruttore – Nepster

6

Una buona ragione per inserire le cose nel costruttore, come aveva affermato il commento di Gili, è l'uso dei campi finali.

Tuttavia, se si inizializzano le cose nel costruttore, quindi la durata dell'oggetto sarà un po 'più lunga, anche se non penso molto perché lo onCreate verrà chiamato poco dopo.

Anche se è contro il mio ideale, io evito il costruttore per l'inizializzazione dei membri dell'attività e contare su di onResume() e onPause() per le risorse che la mia app che fare.

Per onCreate() Di solito lo uso per eseguire il mapping delle viste alle variabili locali. Anche se le annotazioni per android lo fanno già per me, raramente ho un metodo onCreate() per la mia attività. Lo uso ancora in servizio però.

Tuttavia, se si guardano i membri che si può essere l'inizializzazione

  • avrebbero un metodo di "stretta" che si deve richiamare al momento giusto (onResume o onPause)

  • sarebbero parte della vista che significa che deve essere inizializzato quindi onCreate deve essere chiamato

  • sono costanti che non devono essere necessariamente inserite nel costruttore, ma solo una finale statica. Ciò include le costanti Paint e Path che possono essere inizializzate da un blocco statico

+0

Cosa intendi per la durata della vita dell'oggetto sarà un po 'più lungo? Che cosa? Dal momento che se hai spostato queste ini- ziazioni su onCreate, ad esempio, ciò richiede sempre lo stesso tempo. Non c'è differenza nella durata della vita che posso determinare. Potresti espanderti un po 'di più, per favore, poiché ritengo che, in quanto nuovo arrivato, mi manchi qualcosa di cruciale qui. – RichieHH

+2

@RichieHH di più tempo Archimede sta solo dicendo che il costruttore viene chiamato prima di onCreate() e quindi qualunque cosa sia fatta, ci sarà una durata (leggermente) più lunga del tempo in cui l'attività viene distrutta – pho79

+0

Grazie Non ho notato il commento da l'anno scorso. La tua risposta è corretta –

Problemi correlati