java - pasar - ¿Cómo se instancia una actividad de Android(utilizando reflexión)?
como llamar un metodo de otra clase en android (4)
Me preguntaron esto hoy en una entrevista de Android. Respondí lo de siempre, ya sabes, intento + inicio de actividad, etc. Luego, el entrevistador me preguntó con más énfasis,
"Sí, pero ¿dónde está realmente instanciado ? No llama actividad nueva a ninguna parte".
Que ahora que lo pienso, realmente no lo sé. Insinuó que usaba la reflexión de Java, pero no tengo mucha experiencia con eso, y solo lo he usado para acceder a algunas variables en el SDK de Android.
¿Alguien puede explicar cómo se instancian las actividades usando la reflexión y por qué ? Puntos de bonificación para conocer el valor que el entrevistador vio al saber esto.
El núcleo de Android es responsable de administrar la instanciación de 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, agregar la actividad a la pila y muchas otras cosas.
Cuando llamas 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
Cuando se hace clic en el ícono del iniciador de una aplicación en la pantalla de inicio, el siguiente evento ocurre bajo el sistema android:
- La aplicación Homescreen / Launcher envía un intento de iniciar una actividad usando startActivity () (startActivity () es una llamada de binder a ActivityManager)
- El Administrador de actividades envía una solicitud de horquilla de proceso usando un zócalo a Zygote.
- Zygote bifurca 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, programando y ejecutando actividades, difusiones y otras operaciones en él a medida que el gestor de actividad lo solicite).
- ActivityThread tiene real main () para una aplicación.
- ActivityThread llama a la aplicación onCreate ().
Por lo tanto, ActivityThread es responsable de crear una instancia de 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 (se creará una instancia de la clase para usted antes del 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();
}
Mientras no estés en una entrevista para un desarrollador de sistema Android (kernel hacker, ...) la respuesta es simple: se trata de un detalle de implementación del marco Android que un desarrollador normal de Android no debería preocuparse por la abstracción y el principio de capa y puede buscarse en el raro caso de que realmente lo necesite saber.