成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Activity加載顯示基本流程

lauren_liuling / 864人閱讀

摘要:本文章是基于源碼講解加載顯示基本流程首先上一張圖給大家一個直觀的了解首先一個布局頁面的加載是在中的開始我們就從源碼中的方法入手通過源碼我們可以看到又傳給了中的方法返回的是的對象我們來看中方法是一個隱藏類,在源碼中中方法新創(chuàng)建時為空,調(diào)用方

本文章是基于Android源碼6.0講解Activity加載顯示基本流程

首先上一張圖給大家一個直觀的了解

首先一個布局頁面的加載是在Activity中的setContentView(R.layout.res)開始;
我們就從Acitvity源碼中的setContentView方法入手

public void setContentView(@LayoutRes int layoutResID) {
    getWindow().setContentView(layoutResID);
    initWindowDecorActionBar();
}

通過源碼我們可以看到layoutResID又傳給了getWindow()中的setContentView(layoutResID)方法;

mWindow = new PhoneWindow(this);
public Window getWindow() {
    return mWindow;
}

getWindow()返回的是PhoneWindow的對象
我們來看PhoneWindow中setContentView(layoutResID)方法
PhoneWindow是一個隱藏類,在源碼sources/andorid-23/com/android/internal/policy中

PhoneWindow中setContentView方法

 @Override
public void setContentView(int layoutResID) {
   if (mContentParent == null) {
        installDecor();//Activity新創(chuàng)建時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();
    }
}

我們來看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中的一個內(nèi)部類繼承了FrameLayout,是一個幀布局

private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
    ...
}

@1 首先調(diào)用mDecor = generateDecor();返回的是一個 DecorView的對象,這就是所有頁面的跟布局

 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是源碼中的布局,我們來看一下R.layout.screen_simple
在sdk/platforms/android-23/data/res/layout路徑中




R.layout.screen_simple就是一個簡單的線性布局,通過mLayoutInflater.inflate和decor.addView添加到DecorView中,
再通過ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);把R.layout.screen_simple中id
為id/content的Framelayout賦值給contentParent
@3 最后通過mLayoutInflater.inflate(layoutResID, mContentParent);把我們寫的布局添加到mContentParent中。

未完待續(xù)...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71075.html

相關(guān)文章

  • 01.Android之基礎(chǔ)組件問題

    摘要:此時再次旋轉(zhuǎn)屏幕時,該不會被系統(tǒng)殺死和重建,只會調(diào)用。因此可通過和來判斷是否被重建,并取出數(shù)據(jù)進(jìn)行恢復(fù)。但需要注意的是,在取出數(shù)據(jù)時一定要先判斷是否為空。只有在進(jìn)程不被掉,正常情況下才會執(zhí)行方法。 目錄介紹 1.0.0.1 說下Activity的生命周期?屏幕旋轉(zhuǎn)時生命周期?異常條件會調(diào)用什么方法? 1.0.0.2 后臺的Activity被系統(tǒng)回收怎么辦?說一下onSaveInsta...

    iamyoung001 評論0 收藏0
  • Android實(shí)際開發(fā)bug大總結(jié)

    摘要:換句話說,環(huán)境或應(yīng)用程序沒有處于請求操作的適當(dāng)狀態(tài)。項(xiàng)目中異常分析引發(fā)崩潰日志的流程分析解決辦法常見的出現(xiàn)場景狀態(tài)異常非法線程操作。導(dǎo)致的方法出來顯示消息位于該消息之后,遲遲沒有執(zhí)行。這時候,的超時檢測結(jié)束,刪除了服務(wù)中的記錄。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫異常 1.2 java.lang.IllegalStateExce...

    peixn 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<