Android启动app步骤简介

      在app启动,点击屏幕上的图标,程序自然启动,其实展示app图标的界面也是一个Activity只不过它可以启动别的app

      我们称这个程序叫Launcher

整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:

       一. Step1 - Step 11:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;

       二. Step 12 - Step 16:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;

       三. Step 17 - Step 24:Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;

       四. Step 25 - Step 27:ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;

       五. Step 28 - Step 35:ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。

这个启动的具体讲解可参考:http://blog.csdn.net/luoshengyang/article/details/6689748

然后才是app真正的启动:

  ActivityThread会去调用handleLaunchActivity方法启动Activity,在这里面会调用到Activity#onCreate方法,完成DecorView创建动作,当onCreate()方法执行完毕,会继续调用到ActivityThread#handleResumeActivity方法

扫描二维码关注公众号,回复: 8154614 查看本文章

  在该方法内部,获取该activity所关联的window对象,DecorView对象,以及windowManager对象,最终会通过跨进程的方式向WMS(WindowManagerService)发起一个调用,从而将DecorView最终添加到Window上,显示视图

  具体的步骤可参考:https://www.cnblogs.com/ldq2016/p/6672010.html

 这就要说到 Activity Window DecorView之间的关系了他们的关系图如下:

                         

       1.在Activity.setContentView(int resId)中调用PhoneWindow.setContentView(int resId),在其中,如果是第一次调用,那么需要安装DecorView和初始化mContentParent;否则,清空mContentParent中的内容。然后将资源文件通过LayoutInflater的inflate方法来将其转换为View树,并将其添加到mContentParent中。

       2.在将资源文件添加到mContentParent中之前,还有一些布局步骤:(由DecorView来完成)

                 确定窗口类型,既是否有标题栏等等;

                 选择窗口风格对应的布局文件

                 DecorView将该布局文件添加进去,因为DecorView是根视图;

                 DecorView获取id为content的FrameLayout传给mContentParent

       3.通过ActivityThread的handleResumeActivity()来调用Activity的makeVisiable()方法来显示创建的视图族。

View的绘制分为三个过程:

        1.Measure:测量View的大小

       对整个View树进行递归,通过View中measure()方法,来计算View的大小;如果有ViewGroup,需要重写 onMeasure()来遍历计算其中每个子View的大小;

        2.Layout:确定View在父容器中的位置

        调用View的layout()方法来设置其坐标,其中起作用的是:setFrame()设置子View在父视图的坐标轴和 onLayout()设置布局;

        3.Draw:将View绘制出来

        调用draw()绘制View树,并不是每次绘制都会重新绘制每个View树的视图,而只绘制需要重新绘制的视图,可根据View类内部变量的标志位DRAWN来决定是否重新绘制;当有包含该标志位时就需要重新绘制

  

猜你喜欢

转载自www.cnblogs.com/bimingcong/p/12023635.html