Cuando se inicia una nueva aplicación, se llama primero a startActivity para iniciar la Actividad. En este momento, el proceso aún no se ha creado, se bifurcará un nuevo proceso y se creará una instancia de ActivityThread;
Proceso de creación de actividad
La actividad en Android es solo un controlador, responsable de la transferencia de mensajes entre las operaciones del usuario y la Vista. La actividad crea una instancia de Ventana (setContentView) que permite al usuario colocar la interfaz de usuario, pero no es una vista en sí misma, ni realiza ninguna operación en la interfaz de usuario.
La ventana es una clase de ventana de nivel superior. Como estrategia de rendimiento, generalmente se agrega al Administrador de ventanas como una vista. Cada instancia de Actividad corresponde a una instancia de Ventana. Window es solo una clase abstracta y su clase de implementación es android.policy.PhoneWindow , que es una clase muy importante .
Normalmente, el inicio de una actividad llamará al método startActivity (), el método startActivity internamente a través de una clase llamada Instrumentación para iniciar la actividad.
La instrumentación es una clase de herramienta para que las aplicaciones administren la actividad. Proporciona métodos para controlar el ciclo de vida completo de la actividad. Cuando se crea una aplicación, primero creará una instancia de instrumentación , y lainstrumentación iniciará la actividad llamando a execStartActivities.
Los pasos para la creación de actividades son los siguientes:
Paso 1: Envíe la información de creación a Instrumentación por contexto.
El segundo paso: la instrumentación envía la información a ActivityManagerService.
El tercer paso: después de que ActivityManagerService completa el trabajo de grabación relacionado de Activity, envía la información de creación a ApplicationThread.
La cuarta parte: ActivityThread llama ( Instrumentación ) al método de creación de actividad y ejecuta el ciclo de vida de Activity.
Las cuatro partes anteriores son un proceso de transferencia de información simplificado entre el marco y la aplicación, el funcionamiento real será muy complicado.
El cuerpo del método de execStartActivities es el siguiente
public void execStartActivities(Context who, IBinder contextThread, 1431 IBinder token, Activity target, Intent[] intents, Bundle options) { 1432 IApplicationThread whoThread = (IApplicationThread) contextThread; 1433 if (mActivityMonitors != null) { 1434 ···· 1447 } 1448 try { 1449 ····· 1454 int result = ActivityManagerNative.getDefault() 1455 .startActivities(whoThread, intents, resolvedTypes, token, options); 1456 checkStartActivityResult(result, intents[0]); 1457 } catch (RemoteException e) { 1458 } 1459 }
Se pasa un objeto IApplicationThread a este método . La clase IApplicationThread es una clase interna de ActivityThread. Debido a que es una subclase de Binder, el trabajo principal de esta clase es comunicarse entre procesos. Existe un código ActivityManagerNative.getDefault () dentro del método, que en realidad devuelve una instancia de ActivityManagerService. ActivityManagerService llama al método startActivity. Después de que ActivityManagerService registra la información de la actividad, envía un comando para crear un objeto Activity a IApplicationThread . IApplicationThread es la interfaz para la comunicación externa de ActivityThread .
Después de que IApplicationThread reciba el comando de creación de actividad de ActivityManagerService, transmitirá el mensaje de creación a ActivityThread a través del Handler . Después de recibir la información , ActivityThread llama a su propio método handleLaunchActivity ().
La función principal de este método es crear el objeto Actividad y el objeto Aplicación, y ejecutar el método adjunto de la Actividad, y también llamar al método onCreate en el ciclo de vida de la Actividad. El contenido principal del cuerpo del método handleLaunchActivity es el siguiente :
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
2233 Activity a = performLaunchActivity(r, customIntent);此方法内部调用了Activity的attach方法
2235 if (a != null) {
2236 r.createdConfig = new Configuration(mConfiguration);
2237 Bundle oldState = r.state;
2238 handleResumeActivity(r.token, false, r.isForward,
2239 !r.activity.mFinished && !r.startsNotResumed);
2293 }
El trabajo principal del método adjunto de Activity es crear Window y vincular la instancia de WindowManger, también hay un Window.setCallback (), este método es principalmente para permitir que Activity reciba eventos táctiles del usuario y así sucesivamente.
mWindow = PolicyManager.makeNewWindow(this);
5191 mWindow.setCallback(this);
5192 mWindow.getLayoutInflater().setPrivateFactory(this);
5214 mWindow.setWindowManager(
5215 (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
5216 mToken, mComponent.flattenToString(),
5217 (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
5218 if (mParent != null) {
5219 mWindow.setContainer(mParent.getWindow());
5220 }
5221 mWindowManager = mWindow.getWindowManager();
El WindowManger se ha creado antes de que Activity ejecute el método onCreate, y el método setContentView generalmente se llama en oncreate, que completa la adición de View.
1948 public void setContentView(View view) {
1949 getWindow().setContentView(view);
1950 initActionBar();
1951 }
Una vez realizada la creación de la Actividad, se ejecuta el método handleResumeActivity. Este método es principalmente para agregar el DectorView de la actividad al WindowMnager. Este proceso es la operación de mostrar la vista en el setContentView a la pantalla.final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, 2798 boolean reallyResume) { 2803 ActivityClientRecord r = performResumeActivity(token, clearHide); 2804 2805 if (r != null) { 2806 ··········· 2827 if (r.window == null && !a.mFinished && willBeVisible) { 2828 r.window = r.activity.getWindow(); 2829 View decor = r.window.getDecorView(); 2830 decor.setVisibility(View.INVISIBLE); 2831 ViewManager wm = a.getWindowManager(); 2832 WindowManager.LayoutParams l = r.window.getAttributes(); 2833 a.mDecor = decor; 2834 l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION; 2835 l.softInputMode |= forwardBit; 2836 if (a.mVisibleFromClient) { 2837 a.mWindowAdded = true; 2838 wm.addView(decor, l); 2839 } 2895 // Tell the activity manager we have resumed. 2896 if (reallyResume) { 2897 try { 2898 ActivityManagerNative.getDefault().activityResumed(token); 2899 } catch (RemoteException ex) { 2900 } 2901 2904 ····· 2912 }