PhoneWindow

public class PhoneWindow流程 {

    /*** ##android/app/ActivityThread.java**/
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ActivityInfo aInfo = r.activityInfo;
        ContextImpl appContext = createBaseContextForActivity(r);
        java.lang.ClassLoader cl = appContext.getClassLoader();
        //通过 ClassLoader load类名 加载出来,然后反射
        Activity activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        //最后执行 (Activity) cl.loadClass(className).newInstance();
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        //最后执行 (Application) cl.loadClass(className).newInstance();
        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,
                r.assistToken);
        //这个attach见下面
        mInstrumentation.callActivityOnCreate(activity, r.state);
        //起这个默认activity的onCreate方法
        return activity;
    }

    /***##android/app/ActivityThread.java**/
    private void attach(boolean system, long startSeq) {
        mWindow = new PhoneWindow(this, window, activityConfigCallback);
        mWindow.setWindowControllerCallback(mWindowControllerCallback);
        mWindow.setWindowManager(
                (WindowManager) context.getSystemService(Context.WINDOW_SERVICE),
                mToken, mComponent.flattenToString(),
                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
        //这样和WindowManager 建立关系
    }
    /***看完phonewindow创建完 我们看怎么显示view **/
    /***##android/app/ActivityThread.java**/
    public void setContentView(View view) {
        getWindow().setContentView(view); //Window mWindow
    }

    /***com/android/internal/policy/PhoneWindow.java**/
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor(); // //创建DecorView对象和mContentParent对象
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            mContentParent.removeAllViews();
        }
        if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
                    getContext());
            transitionTo(newScene);  ////Activity转场动画相关
        } else {
            mLayoutInflater.inflate(layoutResID, mContentParent);
        }
    }

    /***com/android/internal/policy/PhoneWindow.java**/
    private void installDecor() {
        if (mDecor == null) {
            //调用该方法创建new一个DecorView
            mDecor = generateDecor(-1);
        } else {
            mDecor.setWindow(this);
        }
        // 根据主题theme设置对应的xml布局文件以及Feature(包括style,layout,转场动画,属性等)到DecorView中
        if (mContentParent == null) {
            mContentParent = generateLayout(mDecor);
        }
    }

    /***com/android/internal/policy/PhoneWindow.java**/
    protected DecorView generateDecor(int featureId) {
        return new DecorView(context, featureId, this, getAttributes());
    }

    /***com/android/internal/policy/PhoneWindow.java**/
    protected ViewGroup generateLayout(DecorView decor) {
        // Apply data from current theme.
        //获取当前的主题,加载默认资源和布局
        TypedArray a = getWindowStyle();
        //根据theme的设定,找到对应的Feature(包括style,layout,转场动画,属性等)
        requestFeature(FEATURE_NO_TITLE);//无titleBar
        setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN & (~getForcedWindowFlags()));//设置全屏
        setFlags(FLAG_TRANSLUCENT_STATUS, FLAG_TRANSLUCENT_STATUS & (~getForcedWindowFlags()));//透明状态栏
        //从布局中获取`ID_ANDROID_CONTENT`,并关联至contentParent
        ViewGroup contentParent = (ViewGroup) findViewById(ID_ANDROID_CONTENT);
        //配置完成,DecorView根据已有属性调整布局状态
        mDecor.finishChanging();
        return contentParent;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容