這篇文章將為大家詳細(xì)講解有關(guān)Android中activity從創(chuàng)建到顯示的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為平頂山企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè),平頂山網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
activity是我們平常開發(fā)最常用的一個(gè)組件,我們有必要了解activity的創(chuàng)建以及顯示的過(guò)程,這些應(yīng)該作為我們的儲(chǔ)備知識(shí)。
Activity的創(chuàng)建
Activity的創(chuàng)建以及初始化的過(guò)程是在ActivityThread#performLaunchActivity方法中,在這個(gè)方法中,有以下幾個(gè)關(guān)鍵點(diǎn),
創(chuàng)建Activity
Activity#attach
Instrumentation#callActivityOnCreate
Activity#performStart
Instrumentation#callActivityOnPostCreate
這個(gè)地方能看到Activity生命周期的一小部分。我們需要對(duì)其中一些點(diǎn)進(jìn)行學(xué)習(xí),在這些點(diǎn)里面都有一些非常重要的操作。
創(chuàng)建Activity的過(guò)程就不說(shuō)了,直接反射。我們重點(diǎn)說(shuō)下attach方法,
Activity#attach
attach部分代碼如下
mWindow = new PhoneWindow(this, window); mWindow.setWindowControllerCallback(this); mWindow.setCallback(this); mWindow.setOnWindowDismissedCallback(this); mWindow.getLayoutInflater().setPrivateFactory(this);
在Activity的attach方法中,很關(guān)鍵的一點(diǎn)就是初始化Window,從這里就能看到,Window的實(shí)現(xiàn)類,是PhoneWindow。PhoneWindow的創(chuàng)建對(duì)于我們后面的操作很重要。
Activity#onCreate
public void callActivityOnCreate(Activity activity, Bundle icicle, PersistableBundle persistentState) { prePerformCreate(activity); activity.performCreate(icicle, persistentState); postPerformCreate(activity); }
在activity.performCreate中,會(huì)調(diào)用activity的onCreate方法,這個(gè)是我們平常開發(fā)中非常熟悉的,在onCreate中,我們調(diào)用setContentView去填充布局,并進(jìn)行一些初始化操作
setContentView
到了我們相當(dāng)熟悉的setContentView,在setContentView中,會(huì)調(diào)用PhoneWindow的setContentView方法。我們簡(jiǎn)單看下PhoneWindow的setContentView
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); } mContentParent.requestApplyInsets(); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); } mContentParentExplicitlySet = true; }
在PhoneWindoe的setContentView方法中,會(huì)進(jìn)行初始化DecorView,并將我們?cè)O(shè)置的布局加載到contentparent中。installDecor的具體邏輯我們這里就不多說(shuō)了。
resume過(guò)程
在ActivityThread#handleResumeActivity方法中,有兩個(gè)關(guān)鍵點(diǎn)。
performResumeActivity
Window#addView
performResumeActivity中會(huì)調(diào)用activity的performResume,performResume中會(huì)調(diào)用onResume,然后進(jìn)入onresume聲明周期中
我們重點(diǎn)說(shuō)下addView以及后續(xù)的處理。
addView
wm.addView(decor, l);
這里的wm是WindowManager,是在attach法法中,通過(guò)setWindowManager來(lái)實(shí)現(xiàn)初始化的,對(duì)應(yīng)的實(shí)例為WindowManagerImpl的一個(gè)實(shí)例。那么,我們?nèi)タ聪耊indoeManageImpl的addView方法,在這個(gè)方法中,直接調(diào)用WindowManagerGlobal的addView方法,我們關(guān)心的中點(diǎn)轉(zhuǎn)移了。其中最關(guān)鍵的diam是如下幾行。
root = new ViewRootImpl(view.getContext(), display); view.setLayoutParams(wparams); mViews.add(view); mRoots.add(root); mParams.add(wparams); root.setView(view, wparams, panelParentView);
首先創(chuàng)建一個(gè)ViewRootImpl,然后setView。ViewRootImpl#setView方法代碼較長(zhǎng),我們能發(fā)現(xiàn)requestLayout這個(gè)方法,進(jìn)去看下。
@Override public void requestLayout() { if (!mHandlingLayoutInLayoutRequest) { checkThread(); mLayoutRequested = true; scheduleTraversals(); } }
在這里,進(jìn)行了首次線程檢查。
void scheduleTraversals() { if (!mTraversalScheduled) { mTraversalScheduled = true; mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier(); mChoreographer.postCallback( Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); if (!mUnbufferedInputDispatch) { scheduleConsumeBatchedInput(); } notifyRendererOfFramePending(); pokeDrawLockIfNeeded(); } }
Choreographer,post了一個(gè)Callback,這個(gè)callback是view刷新的核心所在。我們看下TraversalRunnable的run方法,
final class TraversalRunnable implements Runnable { @Override public void run() { doTraversal(); } }
void doTraversal() { if (mTraversalScheduled) { mTraversalScheduled = false; mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier); if (mProfile) { Debug.startMethodTracing("ViewAncestor"); } performTraversals(); if (mProfile) { Debug.stopMethodTracing(); mProfile = false; } } }
在doTraversal中,又會(huì)調(diào)用performTraversals方法,我們看下performTraversals方法是干啥的。這個(gè)方法非常非常的長(zhǎng),但是在這個(gè)方法中,有非常關(guān)鍵的performMeasure,performLayout,performDraw等方法,至此,進(jìn)入的View的的三大過(guò)程,,三大過(guò)程之后,就顯示在我們面前了。
關(guān)于“Android中activity從創(chuàng)建到顯示的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
文章名稱:Android中activity從創(chuàng)建到顯示的示例分析
網(wǎng)頁(yè)鏈接:http://muchs.cn/article38/joocsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站維護(hù)、網(wǎng)頁(yè)設(shè)計(jì)公司、云服務(wù)器、App開發(fā)、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)