¿Cómo se crea una instancia de la actividad de Android (con reflexión)?

Lo pregunté hoy en una entrevista con Android. Respondí el habitual, ya sabes, la intención + startActivity, etc Entrevistador luego preguntó más claramente,

"Sí, pero ¿dónde está instanciado en realidad? No llama a Actividad nueva en ninguna parte".

Que ahora que lo pienso, realmente no lo sé. Él insinuó que se utiliza la reflexión de Java, pero no tengo mucha experiencia con eso, y sólo lo he utilizado para acceder a algunas variables en el SDK de Android.

¿Puede alguien explicar cómo las actividades se instancian usando la reflexión, y por qué ? Puntos de bonificación para una idea de lo que el valor del entrevistador vio en saber esto.

Cuando se hace clic en el icono del lanzador de una aplicación en la pantalla de inicio, el siguiente evento ocurre bajo el sistema android:

  • La aplicación Homescreen / Launcher envía una intención para iniciar una actividad usando startActivity () (startActivity () es la llamada de Binder a ActivityManager)
  • Activity Manager envía una solicitud de fork de proceso mediante un socket a Zygote.
  • Zygote forca una nueva instancia de VM que carga ActivityThread (el subproceso de actividad gestiona la ejecución del subproceso principal en un proceso de aplicación, programación y ejecución de actividades, difusiones y otras operaciones en él como las solicitudes del gestor de actividades).
  • ActivityThread tiene main principal () para una aplicación.
  • ActivityThread llama a la aplicación onCreate ().

Por lo tanto, ActivityThread es responsable de instanciar la actividad (dentro del método performLaunchActivity)

Explicación:

Si observa el stacktrace:

android.app.Instrumentation.newActivity(Instrumentation.java:1021) android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 

Código donde se instancia la nueva actividad:

 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ... //More code Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); StrictMode.incrementExpectedActivityCount(activity.getClass()); r.intent.setExtrasClassLoader(cl); r.intent.prepareToEnterProcess(); if (r.state != null) { r.state.setClassLoader(cl); } } catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to instantiate activity " + component + ": " + e.toString(), e); } } ... //More code return activity; } 

Instrumentation.java (la clase será instanciada para usted antes de cualquier código de la aplicación)

 public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { return (Activity)cl.loadClass(className).newInstance(); } 

La forma sencilla de comprobar la ruta del método constructor es crear un proyecto temporal, sustituir el constructor en su Activity y colocar el punto de interrupción allí.

Usted debe ser capaz de caminar a través de todo el código y encontrar lo que quiere exactamente.

Introduzca aquí la descripción de la imagen

Mientras no estés en una entrevista para un desarrollador de sistema Android (hacker de kernel, …) la respuesta es simplemente: Es un detalle de implementación del framework de Android que un desarrollador de Android normal no debería tener que preocuparse por la abstracción Y el principio de capa y se puede buscar en el caso raro que realmente necesita saberlo.

El núcleo de Android es responsable de administrar la instanciación de la actividad y administrarla en su ciclo de vida de actividad.

El sistema android se encarga de llamar a todos los eventos que puedes controlar en tu clase en el orden correcto, añadir la actividad a la pila y muchas otras cosas.

Cuando llama a startActivity, el núcleo de Android toma el control y crea una instancia de actividad (o reutiliza una anterior si coincide) y comienza a llamar eventos de ciclo de vida de actividad

Puede verlo aquí: http://developer.android.com/reference/android/app/Activity.html en la parte del ciclo de vida de la actividad

  • Reflexión de Java para el método estático privado con parámetros
  • Android: cómo codificar dependiendo de la versión de la API?
  • Anotación personalizada de Java y carga dinámica
  • Métodos de reflexión no funcionan cuando se utiliza proguard para la aplicación de Android
  • Reflexión de Java que maneja cambios de la biblioteca
  • Android, ¿cómo borrar la lista de tareas recientes que podría obtener desde el botón Inicio en la mayoría de teléfono? ¿La reflexión es una manera posible?
  • ¿Se puede usar la reflexión con métodos que pertenecen a un sdk mayor que el mínimo?
  • Error al usar StatusBarManagerService - java.lang.SecurityException en android.permission.STATUS_BAR_SERVICE
  • UnsuppotedOperationException.getCause se devuelve
  • Android Java objModelClass.getClass (). GetDeclaredFields () devuelve "$ change" como un campo
  • Confirmación de mi comprensión del principio de Android Concept (uso de múltiples actividades)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.