最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年11月30日 11:56:36   作者:_StriveG  
這篇文章主要給大家介紹了關(guān)于Android中activity從創(chuàng)建到顯示的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android初學(xué)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。

前言

說(shuō)道Android中的Activity,如果你做過(guò)iOS開發(fā)的話,Activity類似于iOS中的ViewController(視圖控制器)。在應(yīng)用中能看到的東西都是放在活動(dòng)中的?;顒?dòng)是安卓開發(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是我們平常開發(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ò)程之后,就顯示在我們面前了。

總結(jié)

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

相關(guān)文章

最新評(píng)論

绥中县| 辽阳县| 开封县| 阜新| 甘泉县| 霸州市| 康马县| 清水河县| 深水埗区| 霍山县| 息烽县| 平安县| 廊坊市| 普洱| 湖北省| 都江堰市| 鄯善县| 临夏市| 贞丰县| 綦江县| 渝北区| 永年县| 彰化县| 普格县| 长寿区| 斗六市| 莆田市| 沽源县| 普兰县| 沅陵县| 仪征市| 兰坪| 昌乐县| 施甸县| 文登市| 教育| 喜德县| 阿图什市| 祁连县| 鲜城| 隆尧县|