¿Cómo puede el código fuente de Android no tener un método principal y aún así ejecutarse?

He visto esto en algunos tutoriales ahora … pero ¿cómo puede el código fuente de Android no tener un método principal y seguir funcionando?

Por ejemplo (de http://developer.android.com/guide/tutorials/hello-world.html ):

public class HelloAndroid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 

Eso corre pero no hay main !!!

También he pensado que usar cosas como onCreate (o formLoad, etc.) era malo porque un constructor debería hacer ese trabajo y esos métodos incorporados pueden ser a veces malolientes. Pero onCreate es un punto de entrada? Incluso sin un main?

¿Qué pasa si hay más de una actividad … hay una jerarquía para estos controladores de eventos incorporados? ¿OnCreate triunfa sobre todo lo demás? De lo contrario, ¿cómo sabría la aplicación qué ejecutar o dónde ingresar al progtwig?

¡Gracias!

Cada aplicación tendrá su propia máquina virtual. Para ejecutar una aplicación, dentro de su espacio (VM), debe tener un método principal.

Las actividades no son las clases reales que se invocarán para el inicio de la aplicación. Existe una clase llamada Aplicación, que será la clase raíz para el lanzamiento de una aplicación.

Si no hay un método principal, ¿cómo puede una VM reconocer cómo iniciar una aplicación?

Framework tiene clases llamadas Process, VMRuntime, que son responsables de iniciar una aplicación. Que de hecho se refieren al método principal.

Para una mejor comprensión, estudia el servicio Zygote de Android. trata con el servicio Applicationmanager Service, ActivityStack Activity Threadds, etc.

Eso corre pero no hay main !!!

Por supuesto. Muchas cosas que podrías pensar como una “aplicación” de Java no tienen su propio método main() . Por ejemplo, IIRC, servlets, WAR y similares no tienen métodos main() método main() , si lo hay, está en el contenedor.

Pero onCreate es un punto de entrada?

onCreate() es un método.

¿Qué pasa si hay más de una actividad … hay una jerarquía para estos controladores de eventos incorporados?

Realmente no.

¿OnCreate triunfa sobre todo lo demás?

Realmente no.

De lo contrario, ¿cómo sabría la aplicación qué ejecutar o dónde ingresar al progtwig?

Una aplicación no “sabe qué ejecutar ni dónde ingresar al progtwig”.

Una aplicación de Android es una cesta de componentes. Algunos componentes pueden estar vinculados a icons en un iniciador de pantalla de inicio. Algunos componentes pueden estar vinculados a temporizadores progtwigdos, como trabajos cron o tareas progtwigdas de Windows. Algunos componentes pueden estar vinculados a eventos del sistema, como cuando el dispositivo se coloca o se retira de la base de un automóvil. Esos componentes se crearán automáticamente y se usarán cuando corresponda (por ejemplo, cuando un usuario toca el icono en el iniciador de la pantalla de inicio). Sin embargo, otros componentes solo se crean y utilizan cuando su código los solicita específicamente.

Pensar en una aplicación de Android como si se tratara de un progtwig Java en modo consola monolítico le causará problemas.

Le dices cuál ejecutar en el inicio en el archivo de manifiesto. No hay un main () porque no tiene que haberlo, main puede ser una convención utilizada para aplicaciones java “normales”, pero no es para cosas como los applets del navegador. El sistema crea el objeto de actividad y llama a los métodos dentro de él, que pueden llamarse principal o no. En este caso, no lo es.

onCreate es diferente de un principal y de un constructor, ya que se puede invocar dos veces en una sola actividad, por ejemplo, si el proceso se cancela y el usuario navega de regreso a la actividad. Ver http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

En realidad, este tipo de patrón no es peculiar de Android, pero sucede siempre que tienes algún marco en el medio. Algunos ejemplos básicos son Applets y Servlets de Java. Algunas de las respuestas ya proporcionan la respuesta correcta, pero intentaré elaborar un poco.

Cuando inicia una aplicación Java, inicia una JVM y luego necesita cargar algo en ella: por lo tanto, necesita un método estático (el principal) porque no hay objetos (todavía) que vivan en la JVM a los que pueda hacer referencia.

Si tiene algún tipo de estructura en el medio, es el marco el que iniciará la JVM y comenzará a poblarla con sus propios objetos de servicio: escribir su código significa luego escribir sus propios objetos (que serán subclases de una “plantilla” dada). ) Sus objetos pueden luego ser inyectados (cargados) por el marco. Los objetos de servicio de infraestructura gestionan el ciclo de vida de los objetos inyectados llamando a los métodos del ciclo de vida definidos en la superclase “plantilla”.

Por ejemplo, cuando proporciona un applet a un navegador, no ejecuta un método principal estático: solo proporciona una subclase de java.applet.Applet que implementa algunos métodos de instancia que actúan como callback para administrar el ciclo de vida (init, paint , detener…). Es el navegador que lanzará la JVM, creará una instancia de lo que se necesita para el lanzamiento de un applet, cargará su applet y lo llamará.

De manera similar, con los servlets se subclasifica la clase javax.servlet.http.HttpServlet y se implementan algunos métodos de instancia (no estáticos) (doGet, doPost …). El contenedor web (por ejemplo, Tomcat) se encargará de iniciar la JVM, instanciará lo que se necesita para iniciar un servlet, cargar su servlet y llamarlo.

El patrón en Android es más o menos el mismo: lo que haces es crear una subclase de android.app.Activity. Cuando inicia una aplicación, el sistema busca en el manifiesto para descubrir qué actividad debe iniciarse, luego el “marco” lo carga y llama a sus métodos de instancia (onCreate, onPause, onResume …).

En los progtwigs Java, necesitamos un método main (), porque al ejecutar el código de bytes, la JVM buscará el método main () en la clase y comenzará a ejecutar allí.

En Android, la máquina virtual Dalvik está diseñada para encontrar una clase que es una subclase de actividad y que está configurada para iniciar la ejecución de la aplicación desde su método onCreate (), por lo que no es necesario un método main ().

El orden en el que Dalvik Virtual Machine llama a los métodos se basa en el orden de prioridades denominado ciclo de vida android para obtener más información sobre el ciclo de vida de Android. Consulte el enlace debajo de Android Life Cycle: https://developer.android.com/guide/components/activities/ activity-lifecycle.html

Si bien no existe un punto de entrada principal específico, los filtros de intención describen qué actividad se inicia cuando se inicia la aplicación. Se controlan en AndroidManifest.xml como se describe aquí:

http://developer.android.com/guide/topics/intents/intents-filters.html

donde se describe un ejemplo de aplicación de libreta de notas:

Este filtro declara el punto de entrada principal en la aplicación Note Pad. La acción PRINCIPAL estándar es un punto de entrada que no requiere ninguna otra información en el Intento (sin especificación de datos, por ejemplo), y la categoría LAUNCHER dice que este punto de entrada debe aparecer en el iniciador de la aplicación.

Un progtwigdor de Android debe aprender esto como la palma de su mano, simplemente explica todo y ayudaría en el futuro al crear actividades. http://developer.android.com/reference/android/app/Activity.html

Hay una especie de problema principal, simplemente está fuera de tus manos. Después de todo, no hay nada especial acerca de una función main en ningún idioma. Es solo el punto de entrada donde su código comienza a ejecutarse. El sistema operativo Android espera que las aplicaciones tengan una cierta estructura y llama a su código según las convenciones que sigue.

Los applets tampoco tienen métodos main (). Solo depende de cómo se empaqueta tu código.

El marco de la interfaz de usuario de Android encapsula algunos detalles comunes de Java, puede estudiar el código fuente del marco de la interfaz de usuario de Android

Creo que la respuesta de Jonathon va en la dirección correcta. Él dice que el sistema operativo espera una cierta estructura. Hay un nombre para esa estructura que es una “máquina de estado”. En este caso, Android lo llama el “ciclo de vida de la actividad”. Rob da un enlace a la documentación que contiene un diagtwig importante de esa máquina de estado, aunque el texto es un poco seco. Una búsqueda rápida también me encontró el siguiente enlace que lo explica con bastante claridad: http://www.android-app-market.com/android-activity-lifecycle.html

En Java, hay un main incluso si no está listado como main() . La página que obtiene después de hacer clic en el icono, cualquiera que sea su nombre, es main() .