2015-11-09 11 views
19

È stato chiesto questo oggi in un'intervista Android. Ho risposto il solito, si sa, l'intento + startActivity, ecc intervistatore ha poi chiesto più acutamente,Come viene creata un'istanza Android (utilizzando la riflessione)?

"Sì, ma dove è in realtà istanziato? Non si chiama nuova attività da nessuna parte".

Che ora che ci penso, non lo so davvero. Ha accennato al fatto che utilizzava la riflessione Java, ma non ho molta esperienza con questo, e l'ho usato solo per accedere ad alcune variabili nell'SDK di Android.

Qualcuno può spiegare come le attività vengono istanziate utilizzando la riflessione e perché? Punti bonus per conoscere il valore che l'intervistatore ha visto nel sapere questo.

+1

Penso che il valore per l'intervistatore sia che può vedere che non solo è possibile utilizzare il framework, ma anche avere interesse sul perché e dove tutto accade. Ma anche se non l'hai ancora controllato, la tua reazione a domande così inaspettate mostra all'intervistatore come puoi far fronte a situazioni inaspettate e quanto velocemente riesci a trovare una possibile risposta. – abbath

risposta

0

Android core è responsabile della gestione dell'istanza di attività e la gestisce nel suo ciclo di vita dell'attività.

Il sistema Android si occupa di chiamare tutti gli eventi che è possibile controllare nella classe nell'ordine corretto, aggiungere l'attività allo stack e molte altre cose.

Quando si chiama startActivity, nucleo Android prende il controllo e rende un'istanza di attività (o riutilizzare una precedente se match) e comincia a chiamare gli eventi attività del ciclo di vita

Potete vedere qui: http://developer.android.com/reference/android/app/Activity.html in attività del ciclo di vita parte

22

Quando un'icona di avvio di un'applicazione viene cliccato homescreen, a seguito di evento si verifica con il sistema Android:

  • homescreen/Launcher applicazione invia una t intento o avviare un'attività utilizzando startActivity() (startActivity() è la chiamata di binder a ActivityManager)
  • Activity Manager invia una richiesta di fork di processo utilizzando un socket a Zygote.
  • Zygote forca una nuova istanza VM che carica ActivityThread (il thread Attività gestisce l'esecuzione del thread principale in un processo di applicazione, pianifica ed esegue attività, trasmissioni e altre operazioni su di esso mentre le richieste del gestore attività.).
  • ActivityThread ha reale main() per un'app.
  • ActivityThread chiama l'app suCreate().

Quindi ActivityThread è responsabile per istanziare attività (all'interno metodo performLaunchActivity)

Spiegazione:

Se si osserva la stacktrace:

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

codice in cui le nuove l'attività è istanziata :

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

Strumentazione.java (classe sarà un'istanza per voi prima di qualsiasi del codice dell'applicazione)

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

Il modo più semplice per controllare il percorso del metodo di costruzione è quello di creare un progetto temporaneo, ignorare costruttore nel vostro Activity e luogo breakpoint lì.

Dovresti essere in grado di esaminare tutto il codice e trovare esattamente ciò che desideri.

enter image description here

2

Finché non ci si trova in un'intervista per uno sviluppatore Android sistema (kernel hacker ...) la risposta è semplicemente: Questo è un dettaglio di implementazione del quadro Android un normale sviluppatore Android dovrebbe Non è necessario preoccuparsi a causa dell'astrazione e del principio di livello e può essere cercato nel caso raro che avresti davvero bisogno di saperlo.

Problemi correlati