Android View的加载过程
2019獨角獸企業重金招聘Python工程師標準>>>
? ? 大家都知道Android中加載view是從Activity的onCreate方法調用setContentView開始的,那么View的具體加載過程又是怎么的呢?這一節我們做一下分析。
首先追蹤一下代碼:
Activity中:
public void setContentView(int layoutResID) {getWindow().setContentView(layoutResID); }public Window getWindow() {return mWindow; }final void attach {mWindow = PolicyManager.makeNewWindow(this); }? ? ? Activity在調用onCreate()之前會調用attach()初始化mWindow,這篇文章中,我們先不管attach()是誰調用的,也不管他是怎么被調用的。只分析一下view的加載過程。下面是PolicyManager方法:
PolicyManager:
// sPolicy為Policy對象,實現了接口IPolicypublic static Window makeNewWindow(Context context) {return sPolicy.makeNewWindow(context);}
再看Policy類中的代碼?
從而可知 Activity中的setContentView 最終調用的是PhoneWindow類中的 setContentView.?
@Overridepublic void setContentView(int layoutResID) {if (mContentParent == null) {installDecor();} else {mContentParent.removeAllViews();}mLayoutInflater.inflate(layoutResID, mContentParent);final Callback cb = getCallback();if (cb != null && !isDestroyed()) {cb.onContentChanged();}}
installDecor()初始化了DecorView、mContentParent還有title(3.0以后的ActionBar)。DecorView是繼承自FrameLayout的PhoneWindow的內部類。
installDecor()中的代碼:
if (mContentParent == null) {mContentParent = generateLayout(mDecor);
再看 generateLayout : protected ViewGroup generateLayout(DecorView decor) {View in = mLayoutInflater.inflate(layoutResource, null);decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));}
? ? 從上面的代碼看出,加載的視圖添加到了DecorView上,這樣Activitty加載視圖的過程就完成了。試圖加載過程中出現了Activity、Window、View。Activity是Android應用程序的載體,允許用戶在其上創建一個用戶界面,并提供用戶處理事件的API,如onKeyEvent, onTouchEvent等, 并維護應用程序的生命周期。每一個Activity組件都有一個關聯的Window對象,用來描述一個應用程序窗口。每一個應用程序窗口內部又包含有一個View(DecorView)對象,用來描述應用程序窗口的視圖。應用程序窗口視圖是真正用來實現UI內容和布局的,也就是說,每一個Activity組件的UI內容和布局都是通過與其所關聯的一個Window對象的內部的一個View對象來實現的。
轉載于:https://my.oschina.net/201003674/blog/288917
總結
以上是生活随笔為你收集整理的Android View的加载过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Axel与Wget下载工具
- 下一篇: 我的Android 4 学习系列