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;}
阅读全文