Android Activity加载显示的基本流程

来源:互联网 发布:软件逻辑架构图 编辑:程序博客网 时间:2024/05/28 11:49

    • 简介
      • 分布图 来源于动脑学院
    • 笔记
      • 图解
      • 源码解析 Api 26

简介

分布图 来源于动脑学院

笔记

图解

这里写图片描述

这里写图片描述

源码解析 Api 26

我们平时的创建

 @Override public void onCreate(@Nullable Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main); }

往里走

@NonNullpublic AppCompatDelegate getDelegate() {   if (mDelegate == null) {       //创建了 不同api 对应不同的 代理类       mDelegate = AppCompatDelegate.create(this, this);   }   return mDelegate;}@Overridepublic void setContentView(@LayoutRes int layoutResID) {    getDelegate().setContentView(layoutResID);}

AppCompatDelegate.create 分析

//根据不同的api。创建不同的代理方法private static AppCompatDelegate create(Context context, Window window,        AppCompatCallback callback) {    if (Build.VERSION.SDK_INT >= 24) {        return new AppCompatDelegateImplN(context, window, callback);    } else if (Build.VERSION.SDK_INT >= 23) {        return new AppCompatDelegateImplV23(context, window, callback);    } else if (Build.VERSION.SDK_INT >= 14) {        return new AppCompatDelegateImplV14(context, window, callback);    } else if (Build.VERSION.SDK_INT >= 11) {        return new AppCompatDelegateImplV11(context, window, callback);    } else {        return new AppCompatDelegateImplV9(context, window, callback);    }    }

也是上面每个最终的父类都是找到基类

class AppCompatDelegateImplV9 extends AppCompatDelegateImplBase        implements MenuBuilder.Callback, LayoutInflater.Factory2 {     @Override    public void setContentView(View v) {        ...    }    @Override    public void setContentView(int resId) {        //初始化 decor        ensureSubDecor();        //这里其实就是 查找 R.id.content 加入自己的布局 resId        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);        contentParent.removeAllViews();        LayoutInflater.from(mContext).inflate(resId, contentParent);        mOriginalWindowCallback.onContentChanged();    }    @Override    public void setContentView(View v, ViewGroup.LayoutParams lp) {       ...    }    @Override    public void addContentView(View v, ViewGroup.LayoutParams lp) {    ....    }}

现在已经明白 自己的布局 是如何被加入的

private void ensureSubDecor() {    if (!mSubDecorInstalled) {        //创建        mSubDecor = createSubDecor();    }}private ViewGroup createSubDecor() {    //获取主题定义的属性    TypedArray a =     mContext.obtainStyledAttributes(R.styleable.AppCompatTheme);    // 显示标题栏的风格    requestWindowFeature(xxxxx);    // 表示浮在屏幕上的,如果在这里使用了,整个layout就会在 屏幕中心,相当于浮在屏幕上,所以这个只适用于dialog    mIsFloating = a.getBoolean(R.styleable.AppCompatTheme_android_windowIsFloating, false);    a.recycle();     ... 加载不同布局等    final ContentFrameLayout contentView = (ContentFrameLayout) subDecor.findViewById(            R.id.action_bar_activity_content);    //查找不同风格的    final ViewGroup windowContentView = (ViewGroup) mWindow.findViewById(android.R.id.content);    //向 PhoneWindow 设置 DecorView    mWindow.setContentView(subDecor);    return subDecor;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 韵达快递寄丢了怎么办 重要快递送丢了怎么办 快递员送货丢了怎么办 买的快递丢失了怎么办 申通把件弄丢了怎么办 淘宝快递送丢了怎么办 我的快递丢了怎么办 顺丰快递丢件怎么办 韵达快递不发货怎么办 发物流丢了怎么办啊 圆通快递寄丢了怎么办 中通快递弄丢了怎么办 中通快递寄丢了怎么办 中通快递丢了怎么办 物流没保价坏了怎么办 顺丰保值快递丢了怎么办 顺丰保价件丢失怎么办 公司购买货物对方没有发票怎么办 加工货物对方不取怎么办 物流发货发错了怎么办 货车拉的货丢了怎么办 壹米滴答丢货怎么办 物流东西弄丢了怎么办 理赔款账号打错了怎么办 顺丰快递搞丢了怎么办 论文表格跨页了怎么办 网线突然没网了怎么办 室内门高门洞矮怎么办 路基填方土质含水率大怎么办 公路工程材料价格不予调差怎么办 桩基偏位60公分怎么办 定义的跨板受力筋长度不够怎么办 支座梁体预埋钢板忘记埋了怎么办 做nt小孩头朝下怎么办 简历上传的照片太大怎么办 本科毕业论文没写英文摘要怎么办 气泵储气罐有个小眼漏气怎么办 吸拉开关坏了怎么办 窗口数量已达上限怎么办 村土地原始台账没有怎么办 涂防晒霜后出汗怎么办