Android中activity从创建到显示的基本介绍

Android中activity从创建到显示的基本介绍,第1张

概述前言说道Android中的Activity,如果你做过iOS开发的话,Activity类似于iOS中的ViewController(视图控制器)。在应用中能看到的东西都是放在活动中的。活动是安卓开发比较重要的东西,是用户交互和数据的入口。本篇博

前言

说道AndroID中的Activity,如果你做过iOS开发的话,Activity类似于iOS中的VIEwController(视图控制器)。在应用中能看到的东西都是放在活动中的。活动是安卓开发比较重要的东西,是用户交互和数据的入口。本篇博客要介绍的内容是活动的创建,活动的跳转与值的透传。

iOS中的VIEwController也是有自己的生命周期的,了解Activity或者VIEwController的生命周期是很有必要的,本文将详细的给大家介绍关于AndroID中activity从创建到显示的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

activity是我们平常开发最常用的一个组件,我们有必要了解activity的创建以及显示的过程,这些应该作为我们的储备知识。

Activity的创建

Activity的创建以及初始化的过程是在ActivityThread#performlaunchActivity方法中,在这个方法中,有以下几个关键点,

创建Activity Activity#attach Instrumentation#callActivityOnCreate Activity#performStart Instrumentation#callActivityOnPostCreate

这个地方能看到Activity生命周期的一小部分。我们需要对其中一些点进行学习,在这些点里面都有一些非常重要的 *** 作。

创建Activity的过程就不说了,直接反射。我们重点说下attach方法,

Activity#attach

attach部分代码如下

mWindow = new PhoneWindow(this,window);mWindow.setwindowControllerCallback(this);mWindow.setCallback(this);mWindow.setonWindowdismissedCallback(this);mWindow.getLayoutInflater().setPrivateFactory(this);

在Activity的attach方法中,很关键的一点就是初始化Window,从这里就能看到,Window的实现类,是PhoneWindow。PhoneWindow的创建对于我们后面的 *** 作很重要。

Activity#onCreate

public voID callActivityOnCreate(Activity activity,Bundle icicle,PersistableBundle persistentState) { prePerformCreate(activity); activity.performCreate(icicle,persistentState); postPerformCreate(activity);}

在activity.performCreate中,会调用activity的onCreate方法,这个是我们平常开发中非常熟悉的,在onCreate中,我们调用setContentVIEw去填充布局,并进行一些初始化 *** 作

setContentVIEw

到了我们相当熟悉的setContentVIEw,在setContentVIEw中,会调用PhoneWindow的setContentVIEw方法。我们简单看下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方法中,会进行初始化DecorVIEw,并将我们设置的布局加载到contentparent中。installDecor的具体逻辑我们这里就不多说了。

resume过程

在ActivityThread#handleResumeActivity方法中,有两个关键点。

performResumeActivity Window#addVIEw

performResumeActivity中会调用activity的performResume,performResume中会调用onResume,然后进入onresume声明周期中

我们重点说下addVIEw以及后续的处理。

addVIEw

wm.addVIEw(decor,l);

这里的wm是WindowManager,是在attach法法中,通过setwindowManager来实现初始化的,对应的实例为WindowManagerImpl的一个实例。那么,我们去看下WindoeManageImpl的addVIEw方法,在这个方法中,直接调用WindowManagerGlobal的addVIEw方法,我们关心的中点转移了。其中最关键的diam是如下几行。

root = new VIEwRootImpl(vIEw.getContext(),display);vIEw.setLayoutParams(wparams);mVIEws.add(vIEw);mRoots.add(root);mParams.add(wparams);root.setVIEw(vIEw,wparams,panelParentVIEw);

首先创建一个VIEwRootImpl,然后setVIEw。VIEwRootImpl#setVIEw方法代码较长,我们能发现requestLayout这个方法,进去看下。

@OverrIDepublic voID requestLayout() { if (!mHandlingLayoutInLayoutRequest) {  checkThread();  mLayoutRequested = true;  scheduleTraversals(); }}

在这里,进行了首次线程检查。

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了一个Callback,这个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中,又会调用performTraversals方法,我们看下performTraversals方法是干啥的。这个方法非常非常的长,但是在这个方法中,有非常关键的performMeasure,performlayout,performDraw等方法,至此,进入的VIEw的的三大过程,,三大过程之后,就显示在我们面前了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

总结

以上是内存溢出为你收集整理的Android中activity从创建到显示的基本介绍全部内容,希望文章能够帮你解决Android中activity从创建到显示的基本介绍所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1143539.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存