Activity 的Window建立過程

2021-08-06 07:14:23 字數 1286 閱讀 8323

1、performlaunchactivity( )

activitythread 中的performlaunchactivity ( )在通過classloader載入到mainactivity之後,反射出乙個 mainactivity物件activity,然後會呼叫activity.attach( ),在這個函式中,會建立window

//mwindow是activity的乙個成員

private window mwindow;

//可以看出window的最終實現是phonewindow

mwindow = new phonewindow(this, window);

2、那麼 window是如何與activity的檢視產生關係的呢?可以看一下activity的setcontentview( )函式
public

void

setcontentview(@layoutres int layoutresid)

3、phonewindow的setcontentview()如下
public void setcontentview(int layoutresid)  else if (!hasfeature(feature_content_transitions)) 

if (hasfeature(feature_content_transitions)) else

final callback cb = getcallback();

if (cb != null && !isdestroyed())

mcontentparentexplicitlyset = true;

}

他主要是先建立decorview,然後把setcontentview()中傳入的布局新增到mcontentparent (r.id.content對應的布局,其中decorview是乙個framelayout,包含標題欄以及內容檢視,其中mcontentparent就是這個內容檢視)中.

4、檢視顯示時機

但是目前為止,decorview還沒有顯示出來,它需要被新增到windowmanager中,activitythread執行handleresumeactivity( )的時候,先呼叫activity的onresume( ),再呼叫activity的makevisible( )函式,此時頁面才真正滴顯示出來

void makevisible() 

mdecor.setvisibility(view.visible);

}

解釋activity棧 activity的載入模式

activity棧 activity棧是乙個先進先出 包含所有正在執行的activity的佇列。乙個activity的狀態,對於開發者來說是無法控制的,是由系統決定的。那麼activity是按照什麼邏輯來運作的呢,這就要了解activity棧了,每個activity的狀態都是由它在activity棧...

非Activity下跳轉Activity的問題

override public void startactivity intent intent,bundle options mmainthread.getinstrumentation execstartactivity activity null,intent,1,options 避免這種異常...

處理非window設定為window的Owner

普通wpf視窗從乙個window1 show方式 開啟另乙個window2,只要設定window2.owner window1即可。這樣window2的顯示和隱藏可由window1自動控制。但使用wpf usercontrol host到winform時,實現就難了。剛才找到了解決方法 hwndso...