摘要:本文章是基于源碼講解加載顯示基本流程首先上一張圖給大家一個(gè)直觀的了解首先一個(gè)布局頁(yè)面的加載是在中的開始我們就從源碼中的方法入手通過(guò)源碼我們可以看到又傳給了中的方法返回的是的對(duì)象我們來(lái)看中方法是一個(gè)隱藏類,在源碼中中方法新創(chuàng)建時(shí)為空,調(diào)用方
本文章是基于Android源碼6.0講解Activity加載顯示基本流程
首先上一張圖給大家一個(gè)直觀的了解
首先一個(gè)布局頁(yè)面的加載是在Activity中的setContentView(R.layout.res)開始;
我們就從Acitvity源碼中的setContentView方法入手
public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); }
通過(guò)源碼我們可以看到layoutResID又傳給了getWindow()中的setContentView(layoutResID)方法;
mWindow = new PhoneWindow(this); public Window getWindow() { return mWindow; }
getWindow()返回的是PhoneWindow的對(duì)象
我們來(lái)看PhoneWindow中setContentView(layoutResID)方法
PhoneWindow是一個(gè)隱藏類,在源碼sources/andorid-23/com/android/internal/policy中
PhoneWindow中setContentView方法
@Override public void setContentView(int layoutResID) { if (mContentParent == null) { installDecor();//Activity新創(chuàng)建時(shí)mContentParent 為空,調(diào)用installDecor方法 } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) { mContentParent.removeAllViews(); } if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) { final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID, getContext()); transitionTo(newScene); } else { mLayoutInflater.inflate(layoutResID, mContentParent); } mContentParent.requestApplyInsets(); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); } }
我們來(lái)看PhoneWindow中installDecor()方法中的關(guān)鍵部分
private void installDecor() { if (mDecor == null) { mDecor = generateDecor(); //@1 mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); mDecor.setIsRootNamespace(true); if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) { mDecor.postOnAnimation(mInvalidatePanelMenuRunnable); } } if (mContentParent == null) { mContentParent = generateLayout(mDecor); //@2 ... } mLayoutInflater.inflate(layoutResID, mContentParent);//@3 }
在PhoneWindow源碼中聲明了 private DecorView mDecor;
DecorView 是PhoneWindow中的一個(gè)內(nèi)部類繼承了FrameLayout,是一個(gè)幀布局
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker { ... }
@1 首先調(diào)用mDecor = generateDecor();返回的是一個(gè) DecorView的對(duì)象,這就是所有頁(yè)面的跟布局
protected DecorView generateDecor() { return new DecorView(getContext(), -1); }
@2 其次調(diào)用mContentParent = generateLayout(mDecor);
protected ViewGroup generateLayout(DecorView decor) { ... } else if ((features & (1 << FEATURE_ACTION_MODE_OVERLAY)) != 0) { layoutResource = R.layout.screen_simple_overlay_action_mode; } else { // Embedded, so no decoration is needed. layoutResource = R.layout.screen_simple; // System.out.println("Simple!"); } View in = mLayoutInflater.inflate(layoutResource, null); decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); mContentRoot = (ViewGroup) in; ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT); ... return contentParent; }
這里的layoutResource是源碼中的布局,我們來(lái)看一下R.layout.screen_simple
在sdk/platforms/android-23/data/res/layout路徑中
R.layout.screen_simple就是一個(gè)簡(jiǎn)單的線性布局,通過(guò)mLayoutInflater.inflate和decor.addView添加到DecorView中,
再通過(guò)ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);把R.layout.screen_simple中id
為id/content的Framelayout賦值給contentParent
@3 最后通過(guò)mLayoutInflater.inflate(layoutResID, mContentParent);把我們寫的布局添加到mContentParent中。
未完待續(xù)...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71075.html
摘要:此時(shí)再次旋轉(zhuǎn)屏幕時(shí),該不會(huì)被系統(tǒng)殺死和重建,只會(huì)調(diào)用。因此可通過(guò)和來(lái)判斷是否被重建,并取出數(shù)據(jù)進(jìn)行恢復(fù)。但需要注意的是,在取出數(shù)據(jù)時(shí)一定要先判斷是否為空。只有在進(jìn)程不被掉,正常情況下才會(huì)執(zhí)行方法。 目錄介紹 1.0.0.1 說(shuō)下Activity的生命周期?屏幕旋轉(zhuǎn)時(shí)生命周期?異常條件會(huì)調(diào)用什么方法? 1.0.0.2 后臺(tái)的Activity被系統(tǒng)回收怎么辦?說(shuō)一下onSaveInsta...
摘要:換句話說(shuō),環(huán)境或應(yīng)用程序沒有處于請(qǐng)求操作的適當(dāng)狀態(tài)。項(xiàng)目中異常分析引發(fā)崩潰日志的流程分析解決辦法常見的出現(xiàn)場(chǎng)景狀態(tài)異常非法線程操作。導(dǎo)致的方法出來(lái)顯示消息位于該消息之后,遲遲沒有執(zhí)行。這時(shí)候,的超時(shí)檢測(cè)結(jié)束,刪除了服務(wù)中的記錄。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫(kù)異常 1.2 java.lang.IllegalStateExce...
閱讀 3680·2021-11-23 09:51
閱讀 1567·2021-11-04 16:08
閱讀 3619·2021-09-02 09:54
閱讀 3686·2019-08-30 15:55
閱讀 2668·2019-08-30 15:54
閱讀 1025·2019-08-29 16:30
閱讀 2112·2019-08-29 16:15
閱讀 2385·2019-08-29 14:05