¿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".
- Cómo moverse repetición similar-variable en declaraciones if
- Clase personalizada que carga / reemplaza las clases nativas de Android
- Android getOnTouchListener con la versión del API> = 15
- Error de método de reflexión de Android
- ¿Cómo utilizar la reflexión para cambiar el servicio de copia de seguridad?
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.
- Reglas de ProGuard para la reflexión de Kotlin
- Obtener "java.lang.reflect.InvocationTargetException" al intentar registrar receptor de difusión de apk incrustado
- Android / Java: ¿Llamar a un método usando reflexión?
- Call class 'constructor por reflexión con Kotlin
- Cómo acceder a setPreferredNetworkType en la fuente de Android
- Reflexión Java: implementa la interfaz y pasa a otra clase
- ¿Debo dejar el hack de reflexión bluetooth en código de producción?
- Reflexión para un campo que va mal
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.
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
- Autenticador de cuentas personalizadas. Limpieza después de que la cuenta se haya eliminado del dispositivo
- Prueba de geocodificación con Google Play Services 6.5.