午夜激情四射在线播放视频网站|2020亚洲国产精品无码|国产精品免费看久久久网|欧美日韩精品一区三区

ibinder,androidwidgetframelayout怎么解決

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

  ibinder,androidwidgetframelayout怎么解決

正文

文章目錄

  • ibinderandroidwidgetframelayout怎么解決?

ibinderandroidwidgetframelayout怎么解決?

我想大多數(shù)人對于這3個(gè)東西的概念能區(qū)分但是具體區(qū)別在哪卻很難說出來。 我這里根據(jù)我個(gè)人的理解來講講我個(gè)人對這3個(gè)概念的理解。當(dāng)然這里設(shè)計(jì)到通用的事件窗口模型等通用GUI設(shè)計(jì)我這里就不打算講了純粹從概念上來進(jìn)行區(qū)分。 Activity是Android應(yīng)用程序的載體允許用戶在其上創(chuàng)建一個(gè)用戶界面并提供用戶處理事件的API如onKeyEvent, onTouchEvent等。 并維護(hù)應(yīng)用程序的生命周期(由于android應(yīng)用程序的運(yùn)行環(huán)境和其他操作系統(tǒng)不同android的應(yīng)用程序是運(yùn)行在框架之內(nèi)所以他的應(yīng)用程序不能當(dāng)當(dāng)從進(jìn)程的級別去考慮而更多是從概念上去考慮。android應(yīng)用程序是由多個(gè)活動堆積而成而各個(gè)活動又有其獨(dú)立的生命周期)。Activity本身是個(gè)龐大的載體可以理解成是應(yīng)用程序的載體如果木有Activity,android應(yīng)用將無法運(yùn)行。也可以理解成android應(yīng)用程序的入口。Acivity的實(shí)例對象由系統(tǒng)維護(hù)。系統(tǒng)服務(wù)ActivityManager負(fù)責(zé)維護(hù)Activity的實(shí)例對象并根據(jù)運(yùn)行狀態(tài)維護(hù)其狀態(tài)信息。 但在用戶級別程序員可能根愿意理解成為一個(gè)界面的載體。但僅僅是個(gè)載體它本身并不負(fù)責(zé)任何繪制。Activity的內(nèi)部實(shí)現(xiàn)實(shí)際上是聚了一個(gè)Window對象。Window是一個(gè)抽象類它的具體是在android_src_home/framework/policies/base/phone/com/android/internal/policy/impl目錄下的PhoneWindow.java。 當(dāng)我們調(diào)用Acitivity的 setContentView方法的時(shí)候?qū)嶋H上是調(diào)用的Window對象的setContentView方法所以我們可以看出Activity中關(guān)于界面的繪制實(shí)際上全是交給Window對象來做的。繪制類圖的話可以看出Activity聚合了一個(gè)Window對象。 下面是PhoneWindow中的setContentView方法的實(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(); } } Window內(nèi)部首先判斷mContentParent是否為空然后調(diào)用installDecor方法(安裝裝飾器)我們看看這個(gè)方法如何實(shí)現(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)建一個(gè)DecorView,DecorView是一個(gè)擴(kuò)張F(tuán)rameLayout的類是所有窗口的根View。我們在Activity中調(diào)用的setConctentView就是放到DecorView中了。這是我們類圖的聚合關(guān)系如下: Activity--->Window--->DecorView 這是我們得出這3個(gè)類之間安防直接的一個(gè)關(guān)系。 我們詳細(xì)分析一下類對象是如何被創(chuàng)建的。 先不考慮Activity的創(chuàng)建(因?yàn)?Acitivity的實(shí)例由ActivityManager維護(hù)是在另一個(gè)進(jìn)程設(shè)計(jì)到IPC的通信后面會講到)而考慮Window和View的創(chuàng)建。 Activity被創(chuàng)建后系統(tǒng)會調(diào)用它的attach方法來將Activity添加到ActivityThread當(dāng)中。我們找到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對象的代碼。感興趣的同學(xué)可以跟蹤去看看具體是如何創(chuàng)建的。其實(shí)很簡單其內(nèi)部實(shí)現(xiàn)調(diào)用了Policy對象的makeNewWindow方法其方法直接new了一個(gè)PhoneWindow對象如下: public PhoneWindow makeNewWindow(Context context) { return new PhoneWindow(context); } 這時(shí)我們已經(jīng)可以把流程串起來Activity創(chuàng)建后系統(tǒng)會調(diào)用其attach方法將其添加到ActivityThread當(dāng)中在attach方法中創(chuàng)建了一個(gè)window對象。 下面分析View的創(chuàng)建。我們知道Window聚合了DocerView,當(dāng)用戶調(diào)用setContentView的時(shí)候會把一顆View樹仍給DocerView.View樹是已經(jīng)創(chuàng)建好的實(shí)例對象了所以我們研究的是DocerView是個(gè)什么東西它是如何被創(chuàng)建的。 我們回頭看看Window實(shí)現(xiàn)里邊的setContentView方法我們看上面代碼的紅色部分setContentView-> installDecor-> generateDecor. generateDecor直接new了一個(gè)DecorView對象: protected DecorView generateDecor() { return new DecorView(getContext(), -1); } 我們可以去看看DecorView的實(shí)現(xiàn)它是PhoneWindow的一個(gè)內(nèi)部類。實(shí)現(xiàn)很簡單它默認(rèn)會包含一個(gè)灰色的標(biāo)題欄然后在標(biāo)題欄下邊會包含一個(gè)空白區(qū)域用來當(dāng)用戶調(diào)用setContentView的時(shí)候放置用戶View并傳遞事件這里不做詳細(xì)分析感興趣同學(xué)可以自己研究研究。 當(dāng)DecorView創(chuàng)建好之后再回到Window中的setContentView方法中來見上面代碼藍(lán)色部分調(diào)用 mContentParent.addView(view, params); 來將用戶的View樹添加到DecorView中。 到這時(shí)為止我想我們已經(jīng)很清晰的認(rèn)識到它們3者之間的關(guān)系并知道其創(chuàng)建流程。 現(xiàn)在總結(jié)一下: Activity在onCreate之前調(diào)用attach方法在attach方法中會創(chuàng)建window對象。window對象創(chuàng)建時(shí)并木有創(chuàng)建Decor對象對象。用戶在Activity中調(diào)用setContentView,然后調(diào)用window的setContentView這時(shí)會檢查DecorView是否存在如果不存在則創(chuàng)建DecorView對象然后把用戶自己的View 添加到DecorView中。

返回:安防新聞

標(biāo)簽:in   id

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

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

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

洱源县| 灵璧县| 清水县| 南皮县| 丹东市| 昌乐县| 启东市| 六盘水市| 钟山县| 依安县| 共和县| 观塘区| 苗栗市| 沙田区| 抚州市| 湘潭县| 诏安县| 桐庐县| 三河市| 江津市| 高安市| 万山特区| 民乐县| 武汉市| 巴楚县| 利辛县| 宾阳县| 富顺县| 龙川县| 台江县| 南江县| 合水县| 彝良县| 吉水县| 东乌珠穆沁旗| 石嘴山市| 海伦市| 剑河县| 唐河县| 策勒县| 尉犁县|