<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### Android 中window 、view、 Activity的關系 ### 在Activity類中,啟動activity,通過`startActivityForResult()`方法,這是通過外部啟動Activity,實際上啟動核心是內部的一個final方法attach(),attach()方法通過PolicyManager實現一個接口Ipolicy,實現這個接口的類是Policy這個類,實現的方法是`makeNewWindow(Context context)`,`mWindow = PolicyManager.makeNewWindow(this);`創造一個窗體,該窗體是PhoneWindow類型的窗體,PhoneWindow 又繼承于Window,Activity在啟動時實例化了一個PhoneWindow的窗體,PhoneWindow 又在構造函數時實例化了ViewGroup,ViewGroup是view的一個子類。以后添加view通過ViewGroup,同時構造時通過LayoutInflater()把layout資源文件進行加載,setContentView()進行界面的呈現,也是按照這樣的一個順序,最終調用的是PhoneWindow的setContentView(),之后分2種情況,一種是傳的參數直接就是view,最終通過ViewGroup來添加一個view,另一種傳的參數是R的資源文件,此時會用到LayoutInflater()這樣的一個類,把資源文件構造實例化,最終還是實例化view的這樣一個對象,還是調用ViewGroup將view呈現。 - 下圖是activity、window、view之間的聯系 :-: ![](https://img.kancloud.cn/13/84/138452144ef12eea7811d12788429cb3_654x258.png) 圖一、分發事件的方法在Activity、View以及ViewGroup中存在關系 :-: ![](https://img.kancloud.cn/f0/27/f027120f562a667c622092a747298cfc_1152x648.jpg) 圖二、UI界面架構圖 :-: ![](https://img.kancloud.cn/c2/d3/c2d39ad9c8518a042f1363985d7591cb_927x607.png) 圖三、Activity與WindowView的關聯代碼層面流程圖 - Activity的attach()方法 ---------- ~~~ final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident, Application application, Intent intent, ActivityInfo info, CharSequence title, Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances, Configuration config, String referrer, IVoiceInteractor voiceInteractor) { attachBaseContext(context); mFragments.attachActivity(this, mContainer, null); mWindow = PolicyManager.makeNewWindow(this); mWindow.setCallback(this); mWindow.setOnWindowDismissedCallback(this); mWindow.getLayoutInflater().setPrivateFactory(this); if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) { mWindow.setSoftInputMode(info.softInputMode); } if (info.uiOptions != 0) { mWindow.setUiOptions(info.uiOptions); } mUiThread = Thread.currentThread(); mMainThread = aThread; mInstrumentation = instr; mToken = token; mIdent = ident; mApplication = application; mIntent = intent; mReferrer = referrer; mComponent = intent.getComponent(); mActivityInfo = info; mTitle = title; mParent = parent; mEmbeddedID = id; mLastNonConfigurationInstances = lastNonConfigurationInstances; if (voiceInteractor != null) { if (lastNonConfigurationInstances != null) { mVoiceInteractor = lastNonConfigurationInstances.voiceInteractor; } else { mVoiceInteractor = new VoiceInteractor(voiceInteractor, this, this, Looper.myLooper()); } } mWindow.setWindowManager( (WindowManager)context.getSystemService(Context.WINDOW_SERVICE), mToken, mComponent.flattenToString(), (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0); if (mParent != null) { mWindow.setContainer(mParent.getWindow()); } mWindowManager = mWindow.getWindowManager(); mCurrentConfig = config; } ~~~ ---------- Activity啟動的時候,即調用attach()方法會得到一個window,而phoneWindow是window唯一一個實現的子類 - Activity的setContentView()方法 ~~~ public void setContentView(int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); } public void setContentView(View view) { getWindow().setContentView(view); initWindowDecorActionBar(); } public void setContentView(View view, ViewGroup.LayoutParams params) { getWindow().setContentView(view, params); initWindowDecorActionBar(); } ~~~ 從該方法可以看出先得到當前的一個窗體getWindow()方法即一個Activity一定會有一個當前的window,當Activity實例化時,一定會實例化一個并且僅有一個window,window本身不是顯示的視圖,只是一個窗戶玻璃,窗戶玻璃上的窗花(實際上是view)才是真正的視圖,而且window實際上是其唯一的一個實例化的子類PhoneWindow,之后調用phoneWindow的setContentView方法,該方法內部會有一個mContentParent.addView(view, params)方法,來添加view視圖,而這個窗花怎么裁剪和貼到玻璃呢,是通過LayoutInflater()和addView()。 **Activity相當于一個工人,該工人來建造一個窗戶phoneWindow,這個窗戶phoneWindow有一個viewRoot(view 、viewGroup),根視圖,在根視圖上面就要添加一個一個的view,通過 mContentParent.addView(view, params);來達到我們的想要的效果,mContentParent是一個viewGroup(),當我們點擊界面的某一個控件時,實際上windowManagerService接收到這個訊息,來回調Activity的方法,比如onKeyDown()方法。Activity是控制單元,window是承載模型,view才是真正的顯示視圖**。 ***** 總結:就是 **Activity會調用PhoneWindow的setContentView()將layout布局添加到DecorView上,而此時的DecorView就是那個最底層的View。然后通過LayoutInflater.infalte()方法加載布局生成View對象并通過addView()方法添加到Window上,(一層一層的疊加到Window上)所以,Activity其實不是顯示視圖,View才是真正的顯示視圖**。 >[success]注:一個Activity構造的時候只能初始化一個Window(PhoneWindow),另外這個PhoneWindow有一個View容器 mContentParent,這個View容器是一個ViewGroup,是最初始的根視圖,然后通過addView方法將View一個個層疊到mContentParent上,這些層疊的View最終放在Window這個載體上面。 ***** - phonewindow的setContentView有3種重載形式 ~~~ @Override public void setContentView(int layoutResID) { // Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window // decor, when theme attributes and the like are crystalized. Do not check the feature // before this happens. if (mContentParent == null) { 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); } final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); } } @Override public void setContentView(View view) { setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { // Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window // decor, when theme attributes and the like are crystalized. Do not check the feature // before this happens. if (mContentParent == null) { installDecor(); } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) { mContentParent.removeAllViews(); } if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) { view.setLayoutParams(params); final Scene newScene = new Scene(mContentParent, view); transitionTo(newScene); } else { mContentParent.addView(view, params); } final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); } } ~~~ - View和ViewGroup Android系統中的所有UI類都是建立在View和ViewGroup這兩個類的基礎上的。所有View的子類成為”Widget”,所有 ViewGroup的子類成為”Layout”。View和ViewGroup之間采用了組合設計模式,可以使得“部分-整體”同等對待。 ViewGroup作為布局容器類的最上層,布局容器里面又可以有View和ViewGroup。 - LayoutInflater,LayoutInflater.inflate()這兩個是什么意思? LayoutInflater是一個用來實例化XML布局文件為View對象的類 LayoutInflater.infalte(R.layout.test,null)用來從指定的XML資源中填充一個新的View - Activity是Android的顯示視圖么? - 顯然不是,view才是真正的顯示視圖 - Activity是window的容器,如果應用程序不調用Activity的setContentView()來設置該窗口顯示的內容,那么該程序將顯示一個窗口,Activity包含一個setTheme()方法來設置其窗口的風格。 - 參考鏈接 - [Android Activity 、 Window 、 View之間的關系 ](http://blog.csdn.net/u011733020/article/details/49465707) - [Android_UI控件之Activity、Window、View之間的關系](http://www.cnblogs.com/webapplee/p/3774041.html) - [麥子學院sundy老師視頻講解](http://v.youku.com/v_show/id_XODc1NjI5NTM2.html) - 創建UML視圖 - [參考1](http://www.cnblogs.com/handsome1013/p/5534677.html) - [參考2](http://www.cnblogs.com/daizhj/archive/2008/04/14/1153121.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看