国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android中activity從創(chuàng)建到顯示的基本介紹

2019-12-12 01:35:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

說(shuō)道Android中的Activity,如果你做過(guò)iOS開(kāi)發(fā)的話,Activity類似于iOS中的ViewController(視圖控制器)。在應(yīng)用中能看到的東西都是放在活動(dòng)中的。活動(dòng)是安卓開(kāi)發(fā)比較重要的東西,是用戶交互和數(shù)據(jù)的入口。本篇博客要介紹的內(nèi)容是活動(dòng)的創(chuàng)建,活動(dòng)的跳轉(zhuǎn)與值的透?jìng)鳌?/p>

iOS中的ViewController也是有自己的生命周期的,了解Activity或者ViewController的生命周期是很有必要的,本文將詳細(xì)的給大家介紹關(guān)于Android中activity從創(chuàng)建到顯示的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

activity是我們平常開(kāi)發(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è)是我們平常開(kāi)發(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)去看下。

@Overridepublic 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ò)程之后,就顯示在我們面前了。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 滨州市| 宜兰市| 隆德县| 固始县| 贡山| 馆陶县| 胶南市| 彰化县| 河南省| 若羌县| 犍为县| 辽阳市| 满城县| 肃宁县| 历史| 惠东县| 泗洪县| 互助| 伊春市| 墨竹工卡县| 辽阳市| 错那县| 措勤县| 新乡县| 西平县| 舞钢市| 綦江县| 迁西县| 肥乡县| 平山县| 兰溪市| 古丈县| 韶关市| 台东市| 海伦市| 花莲县| 高邑县| 永春县| 宁城县| 安岳县| 崇明县|