(Así como la relación entre la actividad ActivityThread Ventana WindowManager viewRootImpl Vista) para iniciar el proceso de la actividad

ActivityThread procedimiento de entrada es, en su función principal,

  1. Looper inicialización, y la función de bucle abierto, y una nueva instancia de sí mismo, llamado conceden método, como parte del código de
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
Looper.loop();

Antes de crear una nueva actividad, primero inicializar la aplicación (si no está presente).
La actividad en el proceso de creación, la primera llamada
scheduleLaunchActivity()
después de que ellos llaman
handleLaunchActivity()

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    handleConfigurationChanged(null, null);
    //初始化 WindowManagerService,主要是获取到 WindowManagerService 代理对象
    WindowManagerGlobal.initialize();
    //初始化Activity
    Activity a = performLaunchActivity(r, customIntent);

    if (a != null) {
        r.createdConfig = new Configuration(mConfiguration);
        //显示布局
        handleResumeActivity(r.token, false, r.isForward,
                !r.activity.mFinished && !r.startsNotResumed);
       
    }
}

En el método performLaunchActivity, un nuevo ejemplo actividad voluntad a cabo método y realiza conceden

Activity activity = null;
try {
    java.lang.ClassLoader cl = appContext.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);
    }
}
......
activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);

Activity.attach método inicializa la ventana,

mWindow = new PhoneWindow(this, window, activityConfigCallback);
mWindow.setWindowManager(
	(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
	mToken, mComponent.flattenToString(),
	(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
if (mParent != null) {
    mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager();

ventana es una clase abstracta, es un PhoneWindow aplicación específica, Android en la actividad o si de diálogo, se utilizan en phoneWindow. Al mismo tiempo dar a los objetos WindowManager, WindowManager es una clase abstracta, en particular para lograr esto es a WindowManagerImpl la WindowManager

public void setWindowManager(WindowManager wm, IBinder appToken, String appName, boolean hardwareAccelerated) {
    mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
}

Cada actividad tiene un objeto WindowManager, y esto es mWindowManager y WindowManagerService comunicarse, sino también WindowManagerService clave específica que identifica Ver actividad pertenecen tipo IBinder entrante de tiempo mToken de la creación.

Después de realizar estos, más de la actividad en la implementación del método adjuntar, y luego volver al proceso performLaunchActivity continúa,

if (r.isPersistable()) {
	mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
	mInstrumentation.callActivityOnCreate(activity, r.state);
}

Este método onCreate actividad método de devolución, por lo general en onCreate nos propusimos contentView,
los ajustes de la disposición a la actividad, de hecho, sólo por esta vez para llamar a una ventana para ajustar la ventana de diseño:
Activity.setContentView ():

public void setContentView(@LayoutRes int layoutResID) {
    getWindow().setContentView(layoutResID);        
    initWindowDecorActionBar();    
}

PhoneWindow.setContentView ():

public void setContentView(int layoutResID) {
    ...    
    installDecor(); 
    ... 
}

método installDecor inicializa DectorView y mContentParent, mContentParent ver DecorView la sub.
A continuación, la recién creada PhoneWindow y DecorView, pero los dos no tienen ninguna relación, la relación se genera en ActivityThread.performResumeActivity, y luego llamar r.activity.performResume (), llame r.activity.makeVisible, se sumará a la actual DecorView la ventana.

Por lo tanto Activity.onCreate los acabados del método, ActivityThread la performLaunchActivity handleLaunchActivity lógicamente y sustancialmente ejecutado.
En Resumen: Actividad inicializado, Actividad inicializado a la ventana, WindowManager. Ventana es inicializado DecorView

Y realiza ActivityThread.handleStartActivity performStartActivity Después de la ejecución de estos dos métodos, el método correspondiente se ejecuta Activity.onStart. Estos no involucran la parte de interfaz de usuario, no voy a entrar en detalles.

A continuación, en la handleResumeActivity,

final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume) {
    //执行到 onResume()
    ActivityClientRecord r = performResumeActivity(token, clearHide);

    if (r != null) {
        final Activity a = r.activity;
        boolean willBeVisible = !a.mStartedActivity;
        ...
        if (r.window == null && !a.mFinished && willBeVisible) {
            r.window = r.activity.getWindow();
            View decor = r.window.getDecorView();
            decor.setVisibility(View.INVISIBLE);
            ViewManager wm = a.getWindowManager();
            WindowManager.LayoutParams l = r.window.getAttributes();
            a.mDecor = decor;
            l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
            l.softInputMode |= forwardBit;
            if (a.mVisibleFromClient) {
                a.mWindowAdded = true;
                wm.addView(decor, l);
            }

        }
        ...
        if (!r.activity.mFinished && willBeVisible
                && r.activity.mDecor != null && !r.hideForNow) {
            ...
            mNumVisibleActivities++;
            if (r.activity.mVisibleFromClient) {
                //添加视图,详见下面分析
                r.activity.makeVisible(); 
            }
        }

        //resume 完成
        if (reallyResume) {
              ActivityManagerNative.getDefault().activityResumed(token);
        }
    } else {
        ...
    }
}

Activity.makeVisible ():

void makeVisible() {
    if (!mWindowAdded) {
        ViewManager wm = getWindowManager();
        wm.addView(mDecor, getWindow().getAttributes());
        mWindowAdded = true;
    }
    mDecor.setVisibility(View.VISIBLE);
}

En este método llama performResumeActivity, performResumeActivity devolución de llamada Activity.onResume.
En cuál de estos métodos, es primero de la Actividad dector señala ventana DectorView, y
después se añadió a través de WindowManager. WindowManager de addView realización concreta en WindowManagerImpl, mientras que WindowManagerImpl de addView llamará WindowManagerGlobal.addView ().

WindowManagerGlobal.addView ():

public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow) {
    ...
    ViewRootImpl root = new ViewRootImpl(view.getContext(), display);        
    view.setLayoutParams(wparams);    
    mViews.add(view);    
    mRoots.add(root);    
    mParams.add(wparams);        
    root.setView(view, wparams, panelParentView);
    ...
}

Este proceso crea una ViewRootImpl, y anteriormente creado DecoView como un parámetro, después DecoView caso por ViewRootImpl para gestionar, por ejemplo, añadir el DecoView, Vista Eliminar.

ViewRootImpl dio cuenta ViewParent esta interfaz. Vista general de su diseño contenedor primario, DecorView el padre es ViewRootImpl, en

    root.setView(view, wparams, panelParentView);

Este método de ejecución, llevada a cabo padres ViewRootImpl vinculante.

Después de la ejecución, la visualización en la pantalla por otros medios.

Publicado 17 artículos originales · ganado elogios 12 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_24295537/article/details/104984116
Recomendado
Clasificación