亚洲国产综合久久香蕉|亚洲国产超清无码专区|av片在线观看无码免费|亚洲欧美另类精品久久久|人妻无码中文字幕一二三区|亚洲成av人在线观看网址|99久久久无码国产精品不卡|9191精品国产免费久久国语

          ibinder,androidwidgetframelayout怎么解決

          農(nóng)機大全網(wǎng)(www.97661a.com)最新農(nóng)機信息:ibinder,androidwidgetframelayout怎么解決,農(nóng)機新產(chǎn)品,二手農(nóng)機,農(nóng)機補貼目錄,農(nóng)機價格查詢,農(nóng)機報價大全,更多農(nóng)機資訊請查看:農(nóng)機資訊

            ibinder,androidwidgetframelayout怎么解決

          正文

          文章目錄

          • ibinderandroidwidgetframelayout怎么解決?

          ibinderandroidwidgetframelayout怎么解決?

          我想大多數(shù)人對于這3個東西的概念能區(qū)分但是具體區(qū)別在哪卻很難說出來。 我這里根據(jù)我個人的理解來講講我個人對這3個概念的理解。當然這里設計到通用的事件窗口模型等通用GUI設計我這里就不打算講了純粹從概念上來進行區(qū)分。 Activity是Android應用程序的載體允許用戶在其上創(chuàng)建一個用戶界面并提供用戶處理事件的API如onKeyEvent, onTouchEvent等。 并維護應用程序的生命周期(由于android應用程序的運行環(huán)境和其他操作系統(tǒng)不同android的應用程序是運行在框架之內(nèi)所以他的應用程序不能當當從進程的級別去考慮而更多是從概念上去考慮。android應用程序是由多個活動堆積而成而各個活動又有其獨立的生命周期)。Activity本身是個龐大的載體可以理解成是應用程序的載體如果木有Activity,android應用將無法運行。也可以理解成android應用程序的入口。Acivity的實例對象由系統(tǒng)維護。系統(tǒng)服務ActivityManager負責維護Activity的實例對象并根據(jù)運行狀態(tài)維護其狀態(tài)信息。 但在用戶級別程序員可能根愿意理解成為一個界面的載體。但僅僅是個載體它本身并不負責任何繪制。Activity的內(nèi)部實現(xiàn)實際上是聚了一個Window對象。Window是一個抽象類它的具體是在android_src_home/framework/policies/base/phone/com/android/internal/policy/impl目錄下的PhoneWindow.java。 當我們調(diào)用Acitivity的 setContentView方法的時候?qū)嶋H上是調(diào)用的Window對象的setContentView方法所以我們可以看出Activity中關(guān)于界面的繪制實際上全是交給Window對象來做的。繪制類圖的話可以看出Activity聚合了一個Window對象。 下面是PhoneWindow中的setContentView方法的實現(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(); } } Window內(nèi)部首先判斷mContentParent是否為空然后調(diào)用installDecor方法(安裝裝飾器)我們看看這個方法如何實現(xiàn)的 private void installDecor() { if (mDecor == null) { mDecor = generateDecor(); mDecor.setIsRootNamespace(true); } if (mContentParent == null) { mContentParent = generateLayout(mDecor); mTitleView = (TextView)findViewById(com.android.internal.R.id.title); if (mTitleView != null) { if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) { View titleContainer = findViewById(com.android.internal.R.id.title_container); if (titleContainer != null) { titleContainer.setVisibility(View.GONE); } else { mTitleView.setVisibility(View.GONE); } if (mContentParent instanceof FrameLayout) { ((FrameLayout)mContentParent).setForeground(null); } } else { mTitleView.setText(mTitle); } } } } 在該方法中首先創(chuàng)建一個DecorView,DecorView是一個擴張FrameLayout的類是所有窗口的根View。我們在Activity中調(diào)用的setConctentView就是放到DecorView中了。這是我們類圖的聚合關(guān)系如下: Activity--->Window--->DecorView 這是我們得出這3個類之間安防直接的一個關(guān)系。 我們詳細分析一下類對象是如何被創(chuàng)建的。 先不考慮Activity的創(chuàng)建(因為 Acitivity的實例由ActivityManager維護是在另一個進程設計到IPC的通信后面會講到)而考慮Window和View的創(chuàng)建。 Activity被創(chuàng)建后系統(tǒng)會調(diào)用它的attach方法來將Activity添加到ActivityThread當中。我們找到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, Object lastNonConfigurationInstance, HashMap<String,Object> lastNonConfigurationChildInstances, Configuration config) { attachBaseContext(context); mWindow= PolicyManager.makeNewWindow(this); mWindow.setCallback(this); if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) { mWindow.setSoftInputMode(info.softInputMode); } mUiThread = Thread.currentThread(); mMainThread = aThread; mInstrumentation = instr; mToken = token; mIdent = ident; mApplication = application; mIntent = intent; mComponent = intent.getComponent(); mActivityInfo = info; mTitle = title; mParent = parent; mEmbeddedID = id; mLastNonConfigurationInstance = lastNonConfigurationInstance; mLastNonConfigurationChildInstances = lastNonConfigurationChildInstances; mWindow.setWindowManager(null, mToken, mComponent.flattenToString()); if (mParent != null) { mWindow.setContainer(mParent.getWindow()); } mWindowManager = mWindow.getWindowManager(); mCurrentConfig = config; } 我們看紅色的代碼部分就是創(chuàng)建Window對象的代碼。感興趣的同學可以跟蹤去看看具體是如何創(chuàng)建的。其實很簡單其內(nèi)部實現(xiàn)調(diào)用了Policy對象的makeNewWindow方法其方法直接new了一個PhoneWindow對象如下: public PhoneWindow makeNewWindow(Context context) { return new PhoneWindow(context); } 這時我們已經(jīng)可以把流程串起來Activity創(chuàng)建后系統(tǒng)會調(diào)用其attach方法將其添加到ActivityThread當中在attach方法中創(chuàng)建了一個window對象。 下面分析View的創(chuàng)建。我們知道Window聚合了DocerView,當用戶調(diào)用setContentView的時候會把一顆View樹仍給DocerView.View樹是已經(jīng)創(chuàng)建好的實例對象了所以我們研究的是DocerView是個什么東西它是如何被創(chuàng)建的。 我們回頭看看Window實現(xiàn)里邊的setContentView方法我們看上面代碼的紅色部分setContentView-> installDecor-> generateDecor. generateDecor直接new了一個DecorView對象: protected DecorView generateDecor() { return new DecorView(getContext(), -1); } 我們可以去看看DecorView的實現(xiàn)它是PhoneWindow的一個內(nèi)部類。實現(xiàn)很簡單它默認會包含一個灰色的標題欄然后在標題欄下邊會包含一個空白區(qū)域用來當用戶調(diào)用setContentView的時候放置用戶View并傳遞事件這里不做詳細分析感興趣同學可以自己研究研究。 當DecorView創(chuàng)建好之后再回到Window中的setContentView方法中來見上面代碼藍色部分調(diào)用 mContentParent.addView(view, params); 來將用戶的View樹添加到DecorView中。 到這時為止我想我們已經(jīng)很清晰的認識到它們3者之間的關(guān)系并知道其創(chuàng)建流程。 現(xiàn)在總結(jié)一下: Activity在onCreate之前調(diào)用attach方法在attach方法中會創(chuàng)建window對象。window對象創(chuàng)建時并木有創(chuàng)建Decor對象對象。用戶在Activity中調(diào)用setContentView,然后調(diào)用window的setContentView這時會檢查DecorView是否存在如果不存在則創(chuàng)建DecorView對象然后把用戶自己的View 添加到DecorView中。

          返回:安防新聞

          標簽:in   id

          廣告咨詢:18215288822   采購熱線:18215288822

          聲明:農(nóng)機大全所有(圖文、音視頻)均由用戶自行上傳分享,僅供網(wǎng)友學習交流,版權(quán)歸原作者。若您的權(quán)利被侵害,請聯(lián)系 56325386@qq.com 刪除。

          載注明出處:http://www.97661a.com/news/293238.html

          南昌县| 宜州市| 自贡市| 六安市| 阳春市| 洪湖市| 镇康县| 南溪县| 江西省| 巨鹿县| 澳门| 平武县| 册亨县| 安阳市| 安吉县| 镇平县| 广昌县| 凤冈县| 呼伦贝尔市| 枣庄市| 克拉玛依市| 闸北区| 临武县| 和平县| 云阳县| 建水县| 武夷山市| 墨江| 镇赉县| 吉木乃县| 宁武县| 开阳县| 开鲁县| 白玉县| 长子县| 正定县| 惠水县| 文安县| 柯坪县| 泰州市| 秀山|