出處:http://blog.csdn.net/xieqibao/article/details/6567814
為欒城等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及欒城網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站建設(shè)、欒城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!其實(shí)在android中真正展示給用戶的是window和view,activity在android中所其的作用主要是處理一些邏輯問題,比如生命周期的管理、建立窗口等。在android中,窗口的管理還是比較重要的一塊,因?yàn)樗苯迂?fù)責(zé)把內(nèi)容展示給用戶,并和用戶進(jìn)行交互。響應(yīng)用戶的輸入等。
在講窗口管理時(shí),有必要先說下ViewManager這個(gè)接口,這個(gè)接口主要有以下的實(shí)現(xiàn)子接口和實(shí)現(xiàn)類,分別是:WindowManager和ViewGroup里面還有三個(gè)重要的方法:
* addView();
* updateViewLayout();
* removeView();
在WindowManager中,addView方法表示的是將主窗口中的頂級(jí)view(也就是DecorView)添加到WindowManager中,并建立會(huì)話。接下來會(huì)詳細(xì)介紹。我們先來看看Window
window:
Window是android中的窗口,表示頂級(jí)窗口的意思,也就是主窗口,它有兩個(gè)實(shí)現(xiàn)類,PhoneWindow和MidWindow,我們一般的activity對(duì)應(yīng)的主要是PhoneWindow,在activity中經(jīng)常使用的setContentView等方法也是在這個(gè)里面實(shí)現(xiàn)的。
@Override
public void setContentView(View view,ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null) {
cb.onContentChanged(); //窗口類容發(fā)生變化時(shí)更新
}
}
每個(gè)主窗口中都有一個(gè)View,稱之為DecorView,是主窗口中的頂級(jí)view(實(shí)際上就是ViewGroup),在View中有兩個(gè)成員變量叫做mParent、mChildren,它是用來管理view的上下級(jí)關(guān)系的。而ViewGroup是對(duì)一組View的管理。因此,在ViewGroup中建立了所有view的關(guān)系網(wǎng)。而最終ViewGroup附屬在主窗口上。這樣就很容易在窗口中通過findViewById找到具體的View了。view中的事件處理也是根據(jù)這個(gè)路徑來處理的。
我們?cè)賮砜纯碅ctivityThead中的兩個(gè)重要的方法(至于ActivityThead將在一篇中詳細(xì)介紹):
performLaunchActivity( );
handleResumeActivity( );
在performLaunchActivity中,會(huì)調(diào)用activity.attach方法建立一個(gè)window, 在handleResumeActivity方法中啟動(dòng)activity的時(shí)候,會(huì)將主窗口加入到WindowManager中
View decor =r.window.getDecorView(); //獲得窗口的頂級(jí)View
decor.setVisibility(View.INVISIBLE);
ViewManager wm= a.getWindowManager(); //WindowManager繼承自ViewManager
WindowManager.LayoutParams l =r.window.getAttributes();
a.mDecor = decor;
l.type =WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l); //實(shí)際上是把主窗口的頂級(jí)view加入到WindowMangaer
}
我們?cè)賮砜纯碬indowManager。
windowManager:
WindowManager主要用來管理窗口的一些狀態(tài)、屬性、view增加、刪除、更新、窗口順序、消息收集和處理等。
通過Context.getSystemService(Context.WINDOW_SERVICE)的方式可以獲得WindowManager的實(shí)例.
WindowManager繼承自ViewManager,里面涉及到窗口管理的三個(gè)重要方法,分別是:
* addView();
* updateViewLayout();
* removeView();
在WindowManager中還有一個(gè)重要的靜態(tài)類LayoutParams.通過它可以設(shè)置和獲得當(dāng)前窗口的一些屬性。
我們先來看看addView()方法,在addView中,會(huì)利用LayoutParams獲得window的View屬性,并為每個(gè)window創(chuàng)建ViewRoot,ViewRoot是View和WindowManager之間的橋梁,真正把View傳遞給WindowManager的是通過ViewRoot的setView()方法,ViewRoot實(shí)現(xiàn)了View和WindowManager之間的消息傳遞。在將主窗口添加到WindowManger時(shí),它首先會(huì)建立一個(gè)代理對(duì)象:
wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE)
并且打開會(huì)話(IWindowSession),之后Window將通過該會(huì)話與WindowManager建立聯(lián)系,
來看下setView方法:
try {
res =sWindowSession.add(mWindow, mWindowAttributes,
getHostVisibility(), mAttachInfo.mContentInsets);
} catch (RemoteException e) {
mAdded = false;
mView = null;
mAttachInfo.mRootView =null;
unscheduleTraversals();
throw newRuntimeException("Adding window failed", e);
} finally {
if (restore) {
attrs.restore();
}
}
在這段代碼中,ViewRoot通過IWindowSession把窗口添加到WindowManager中。ViewRoot繼承了Handler,實(shí)際上它的本質(zhì)就是一個(gè)Handler,窗口中View的事件處理、消息發(fā)送、回調(diào)等將通過ViewRoot來處理。
這樣就完成了把窗口添加到WindowManager中,并交由WindowManager來管理窗口的view、事件、消息收集處理等。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前文章:Android之Window、WindowManager與窗口管理-創(chuàng)新互聯(lián)
本文URL:http://www.rwnh.cn/article20/copojo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、做網(wǎng)站、小程序開發(fā)、全網(wǎng)營銷推廣、手機(jī)網(wǎng)站建設(shè)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容