2010-11-19 7 views
18

He visto esto en algunos tutoriales ahora ... pero cómo en el mundo el código fuente de Android no tiene un método principal y aún se puede ejecutar.¿Cómo puede el código fuente de Android no tener un método principal y aún así ejecutarse?

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); 
    } 
} 

que se ejecuta pero no hay ninguna principal !!!

También he pensado que utilizar 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 programa?

Gracias!

Respuesta

5

Dígale cuál ejecutar al iniciar 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

8

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(); el método main(), si lo hay, está en el contenedor.

Pero onCreate es un punto de entrada?

onCreate() es un método.

¿Qué sucede 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 programa?

Una aplicación "no sabe qué ejecutar ni dónde ingresar al programa".

Una aplicación de Android es una cesta de componentes. Algunos componentes pueden estar vinculados a iconos en un iniciador de pantalla de inicio. Algunos componentes pueden estar vinculados a temporizadores programados, como trabajos cron o tareas programadas 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 programa Java en modo consola monolítico le causará un sinfín de problemas.

1

Hay una especie de problema principal, simplemente está fuera de sus 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.

0

El marco de interfaz de usuario de Android encapsular algunos detalles comunes de Java, se puede estudiar el código fuente del marco de interfaz de usuario Android no

1

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

2

Si bien no hay un punto de entrada principal específico, los filtros de intención describen qué actividad se inicia cuando se inicia la aplicación. que están controlados 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 la almohadilla de nota:

Este filtro declara el punto de entrada principal a la pista de nota solicitud. 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.

0

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 diagrama 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

-2

En Java, hay una línea principal incluso si no aparece como main(). La página que obtiene después del clic del icono, cualquiera que sea su nombre, es main().

+1

[tag: androide] no es [tag: java] para empezar, e incluso en Java, lo que dices no siempre es cierto: por ejemplo, Java ME [tag: midp] no tiene 'main' y funciona muy bien – gnat

+0

JavaFX tampoco requiere main. Vamos, esto está mal! – ThePerson

11

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 existe un método principal, ¿cómo puede una máquina virtual reconocer cómo iniciar una aplicación?

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

Para una mejor comprensión, estudiar el servicio de cigotos de Android. se ocupa de Applicationmanager Service, ActivityStack Activity Threadds, etc.

+0

Nota: esto se puede ver como * Inversion Of Control *, donde el Android FrameWork llama a los componentes de sus aplicaciones. Entonces, no necesitas un método 'main()'. – TheLostMind

5

En realidad, este tipo de patrón no es peculiar de Android, pero sucede siempre que tiene 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) viviendo en la JVM que pueda Referirse a.

Si tiene algún tipo de marco en el medio, es el marco que iniciará la JVM y comenzará a poblarlo con sus propios objetos de servicio: escribir su código significa escribir sus propios objetos (que serán subclases de dado "plantilla"). 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 inicia 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 devolución de llamada para administrar el ciclo de vida (init, pintar, parar ...). 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) será el encargado de lanzar la JVM, una instancia de lo que se necesita para el lanzamiento de un servlet, cargar el servlet y lo llaman.

El patrón de Android es más o menos la misma: ¿qué hacer es crear una subclase de android.app.Activity. Cuando se inicia una aplicación, el sistema busca en el manifiesto para saber qué actividad debe iniciarse, entonces el "marco" lo carga y llama a sus métodos de instancia (onCreate, onPause, onResume ...).

3

En los programas de Java necesitamos un método main(), porque al ejecutar el código de byte, 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 main () método.

El orden en el que Dalvik Virtual Machine llama a los métodos se basa en el orden de prioridades llamados ciclo de vida androide para obtener más información sobre el ciclo de vida del androide comprobar el siguiente enlace Android Ciclo de Vida: https://developer.android.com/guide/components/activities/activity-lifecycle.html

Cuestiones relacionadas