Android (tres), el principio de funcionamiento de la actividad

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    }
  
   
   

Supongo que te gusta

Origin blog.csdn.net/jiabailong/article/details/50972742
Recomendado
Clasificación