Android - Activity Constructor vs onCreate

88

Entiendo que Android Activitiestiene ciclos de vida específicos y eso onCreatedebería anularse y usarse para la inicialización, pero ¿qué sucede exactamente en el constructor? ¿Hay casos en los que también podría / debería anular el Activityconstructor, o nunca debería tocarlo?

Supongo que el constructor nunca debe usarse porque las referencias a Activitiesno se limpian por completo (lo que obstaculiza al recolector de basura) y eso onDestroyestá ahí para ese propósito. ¿Es esto correcto?

idolatrar
fuente
2
¿Qué pasa con el hecho de que Android puede destruir / recrear su actividad en cualquier momento? No sabe si se llamará al constructor en ese momento e incluso si, a qué constructor se llamará ... (lo mismo se aplica a los Fragmentos y es por eso que cada Fragmento tiene que implementar un constructor predeterminado vacío).
Marian Paździoch

Respuestas:

34

No puedo pensar en ninguna buena razón para hacer algo en el constructor. Nunca construye una actividad directamente, por lo que no puede usarla para pasar parámetros. Generalmente, solo haz cosas en onCreate.

Cheryl Simon
fuente
73
onCreate () le impide utilizar campos finales.
Gili
2
Pero OnCreate no se llama solo una vez, ¿me equivoco? Cuando cambio la orientación de la pantalla y la regreso con mi mano, cada vez que la actividad se recarga, se llama a
oncreate
2
@fercis onCreate se llama solo una vez por instancia, creo. Al rotar el dispositivo, esa instancia de la Actividad se destruye y se crea una nueva, llamando a onCreate. Dicho esto, estoy bastante seguro de que no puede crear una instancia de los campos finales en onCreate porque Java no sabe que onCreate solo se llamará una vez (y, de hecho, podría volver a llamarlo usted mismo en su código; sucederán cosas malas, pero aún se compilará) y, por lo tanto, la única forma de instanciar los campos finales sería en el constructor.
Harvey Adcock
¿Cuándo comienza a ejecutarse el evento OnCreate exactamente? Cuando establezco un punto de interrupción al comienzo del evento OnCreate para que la aplicación se ejecute y cargue la actividad en la pantalla, luego se activa el punto de interrupción y la aplicación se detiene. Necesito un evento sobre la actividad que se active exactamente antes de que la actividad se inicialice y se lance.
Mohammad Afrashteh
@Cheryl Simon, dijiste que nunca creas una actividad directamente, entonces, ¿quién crea la actividad?
Sreekanth Karumanaghat
7

Una buena razón para poner cosas en el constructor como había dicho Gili es el uso de campos finales.

Sin embargo, si inicializa cosas en el constructor, entonces la vida útil del objeto será un poco más larga, aunque no lo creo porque onCreatese llamaría poco después.

A pesar de que es en contra de mi ideal, yo evito el constructor para la inicialización de los miembros de la actividad y confiar en onResume()y onPause()por los recursos que mi aplicación está tratando.

Por onCreate()lo general, lo uso para hacer el mapeo de vistas a variables locales. Aunque las anotaciones de Android ya lo hacen por mí, rara vez tengo un onCreate()método para mi actividad. Sin embargo, todavía lo uso en servicio.

Sin embargo, si observa los miembros, es posible que esté inicializando

  • tendrían un método de "cierre" que debe invocar en el momento adecuado (onResume o onPause)

  • serían parte de la vista, lo que significa que debe inicializarse y luego debe llamarse onCreate

  • son constantes que no necesitan ser puestas en el constructor de todos modos, solo una final estática sería suficiente. Esto incluye las constantes Paint y Path que se pueden inicializar mediante un bloque estático

Arquímedes Trajano
fuente
1
¿Qué quiere decir con que la vida útil del objeto será un poco más larga? Yo de que manera Ya que si movió estas iniciaciones a onCreate, por ejemplo, eso todavía lleva el mismo tiempo. No hay diferencia en la vida útil que pueda determinar. ¿Puede ampliar esto un poco más, por favor, ya que siento, como un recién llegado relativamente, que podría estar perdiendo algo crucial aquí?
RichieHH
2
@RichieHH por más largo Arquímedes solo dice que se llama al constructor antes de onCreate () y, por lo tanto, cualquier cosa que se haga allí habrá persistido (un poco) más que de otra manera para cuando se destruya la actividad
pho79
6

Ahora estoy en un caso que necesita anular el constructor. De hecho, tengo algunas actividades que tienen la misma estructura. Entonces, en lugar de crear muchas actividades, crearé una actividad "Maestra" y las otras heredarán esta. Entonces, necesito anular el constructor de la actividad secundaria para poder inicializar algunas variables que se usarán en los métodos oncreate.

En dos palabras, el constructor te hace simular una "actividad maestra" que puede ser reutilizada por herencia.

biboMandroid
fuente
15
Sé que esto es antiguo, pero ¿cuál es el beneficio aquí con respecto a la implementación de la instanciación de supercampo en onCreate ()? De todos modos, llamarás a super.onCreate () desde el niño.
Andrew G
Entonces, simplemente pasando valores diferentes a la misma CLAVE en el paquete o intención mientras se inicia la actividad y, por lo tanto, utilizando la misma Actividad, puede determinar qué mostrar en la Actividad según el valor recibido. ¿Cuál es la razón específica por la que eligió a los constructores? O si no, manteniendo la parte que no cambia de la Actividad en común y para el resto de la parte que cambia, podría haber creado Fragmentos.
Nayanesh Gupte
0

Debe anular el Constructor cuando su actividad tenga parámetros personalizados o desee realizar un seguimiento de las llamadas de las clases heredadas de.

Pentium10
fuente
1
¿Puedes dar más detalles sobre esto? Lo que describe suena interesante, pero es un poco vago. ¡Gracias!
idolatra el
3
Suponga que necesita crear una clase de actividad personalizada que requiera 2 o más parámetros. Solo necesita usar el Constructor, no puede hacerlo a través de onCreate y extras. Te ayuda?
Pentium10
1
Puede que necesite uno privado. Supongamos que quiero crear un componente personalizado, por ejemplo, un selector de contactos personalizado. Para tenerlo startActivityForResult, debo incluir un constructor privado en mi componente personalizado, incluso si esa actividad nunca se iniciará y no tiene elementos visibles, solo uso el material de resultado.
Pentium10
6
Voy a decir que eso no tiene sentido para mí @Pentium, no sin un ejemplo de código.
Blundell
Creo que una de las ventajas de hacer las cosas a través del constructor es tener una actividad de "plantilla" que puede tomar parámetros que una clase heredada puede aprovechar. Por ejemplo, si tiene dos actividades que solo difieren en algunas de las propiedades, por ejemplo, R.id.cameraSurface, R.id.videoSurface, entonces puede crear un constructor que tomará un parámetro llamado AbstractResourceActivity y luego tiene CameraActivity que está registrado en el manifiesto que extiende AbstractResourceActivity pasando el ID del recurso.
Archimedes Trajano