Android程序的入口到底在哪里呢?任何的控制类程序都有一个入口,而Android基于java语言的,因此java程序的入口必须在某一个类的静态成员函数main();而在Android程序main函数在类ActivityThread中,看看ActivityThread.main()做了什么?

public final class ActivityThread {

......

public static void main(String[] args) {

.....

Looper.prepareMainLooper();//创建MessageQueue消息队列

ActivityThread thread = new ActivityThread();//创建ActivityThread对象

thread.attach(false);

if (sMainThreadHandler == null) {

sMainThreadHandler = thread.getHandler();//获取Handler对象

}

......

}

final ApplicationThread mAppThread = new ApplicationThread();

final Looper mLooper = Looper.myLooper();

final H mH = new H()

}

程序首先在ActivityThread类main()函数执行,调用函数prepareMainLooper()在主线程创建一个消息队列(MessageQueue)。

然后创建ActivityThread对象,在ActivityThread对象创建的同时,创建ApplicationThread对象,和Handler对象。

ApplicationThread对象作用:ApplicationThread对象是Binder对象,负责接收远程的AMS的IPC调用。

Handler对象作用: 负责发送消息到消息队列。UI线程会异步的从消息队列取出消息并做相应的操作。

当有了这两个对象后,就可以接收AMS发送来的远程消息(start,stop,pause)。并且可以回调回ActivityThread

当ApplicationThread对象接收到AMS发送start某个 Activity,通过Handler发送消息到消息队列,ActivityThread.handleMessage取出相应的消息,就会创建指定的Activity。Activity是怎样被创建出来的?去看看ActivityThread.handleMessage做了什么?

public final class ActivityThread {

......

public void handleMessage(Message msg) {

switch (msg.what) {

case LAUNCH_ACTIVITY: {

......

handleLaunchActivity(r, null);

......

break;

}

}

}

}

当AMS要start某个Activity,回调到ActivityThread.handleMessage中,调用handleLaunchActivity函数。进入handleLaunchActivity函数看看。

public final class ActivityThread {

......

Activity a = performLaunchActivity(r, customIntent);

......

if (a != null) {

......

handleResumeActivity(r.token, false, r.isForward,

!r.activity.mFinished && !r.startsNotResumed);

......

}

.......

}

}

进去一看调用了performLaunchActivity函数返回Activity,想必在这个函数中创建Activity的,再去看看performLaunchActivity函数。

public final class ActivityThread {

......

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

......

Activity activity = null;

......

java.lang.ClassLoader cl = r.packageInfo.getClassLoader();

activity = mInstrumentation.newActivity(

cl, component.getClassName(), r.intent);

......

return activity;

}

}

在performLaunchActivity函数可以看出,通过类加载器在mInstrumentation.newActivity函数中创建出Activity。就这样Activity就创建出来了。

(1)当Activity被创建出来后,又会创建相关的类,创建的流程为:

contextImpl类–>PhoneWindow类——->WindowManagerImpl类—->DecorView类—->相应的VIew后ViewGroup(layout.xml布局文件)。

创建完后,Activity需要把创建好的界面显示到屏幕上,调用的流程为:

WindowManager类—->ViewRoot类—->WMS远程接口,这样就完成一个窗口添加到屏幕上。

由(1)可以得出Android应用程序窗口的大概模型:

当窗口添加到屏幕上后接下来,用户开始在程序界面上操作,KeyQ线程把这些消息保存到消息队列中,而InputDipatchThread线程逐个的取出消息,然后调用WMS的相应消息处理函数,WMS判断该消息是属于哪一个窗口的,然后封装好,发送给相应的ViewRoot中的W接口。

事件分发的过程:

WMS—–>ViewRoot.W接口—->ViewRoot类—>ActivityThread —->PhoneWindon.DecorView—->Activity—–>PhoneWindow—->PhoneWIndow.Decorview—>ViewGroup—->子view。

由上面流程可知,app程序运行的大概的整体流程可总结为两点:

创建窗口(UI)显示在屏幕上。—–>a

接收用户消息(按键,触摸) 发给相应的窗口做相应的处理。—->b

对于a:创建Activity对象之后会继续创建ContextImpl类,PhoneWindow类,DecorView类,WindowManagerImpl类,ViewRoot类,layout.xml(布局文件),接下来的文章会根据源码分析这些对象的产生和这些类的继承关系,类的作用,这些类之间的关系。

由(1)得出Android应用程序窗口模型,换种理解:

Android应用程序窗口 = Activity + PhoneWindow + DecorView;—->c

DecorView = TitleView + contentView(layout.xml布局文件);—–>d

这里的等于号并不是真正意思的等于,这里描述的是一种大概的意思,对于c而言,Android应用程序窗口模型 描述为,大概 由Activity + PhoneWindow +DecorView组成,而DecorView 大概由TitleView + ContentView(layout.xml布局文件)组成。只是大概的由这些组成。Android应用程序窗口的组成 还可以 包括 Dialog, PopupWIndow。

而d 就是我们要学习的重点,简称Android应用程序窗口视图;添加窗口到屏幕上,其实最重要的就是把我们的布局文件绘制上去,而这就是我们常说的View的绘制。

经过这样分析,又可以把app程序运行过程的两个重要点可以总结为:

View的绘制;

用户消息事件的分发:

这里出现了几个很重要的类,AMS,WMS,WM,ViewRoot,Activity,ActivityThread,它们之间的关系:

整个流程可以总结为:

android app入口函数,Android App程序运行过程 ActivityThread.main()------详解系列(一)...相关推荐

  1. android 删除文件函数,Android updater

    这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...

  2. 习题 11.1 将例11.1的程序片断补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上。。

    C++程序设计(第三版) 谭浩强 习题11.1 个人设计 习题 11.1 将例11.1的程序片断补充和改写成一个完整.正确的程序,用公用继承方式.在程序中应包括输入数据的函数,在程序运行时输入num, ...

  3. 习题 11.1 将例11.1的程序片断补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值。

    习题 11.1 将例11.1的程序片断补充和改写成一个完整.正确的程序,用公用继承方式.在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个 ...

  4. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

    Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...

  5. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  6. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!...

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  7. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  8. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  9. 内存管理——程序运行过程中内存的作用以及如何与cpu、os交互

    今年以来,内存条价格暴涨,已经跃升为新的新一代理财产品,所以今天就和大家讨论一下内存条的话题,主要内容就是在程序运行过程中,内存的作用以及如何与CPU,OS交互. 我们先来讨论:计算机的运行究竟是在做 ...

  10. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)

    文章大纲 引言 一.Android Storage Access Framework 二.Storage Access Framework 的主要角色成员 1.Document Provider 文件 ...

最新文章

  1. hdu 1789 Doing Homework again
  2. cordova打开文件_Cordova开发App入门(四)打开及下载第三方App
  3. ORACLE如何一次性修改用户连接数?
  4. vendor自动恢复_push文件到system分区,重启后文件会被自动恢复
  5. 怎么修剪_杏树怎么育苗?怎么修剪怎么防治病虫害?
  6. git学习-pull命令
  7. OpenCV总结:图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
  8. 9.react 从入门到放弃
  9. 使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决
  10. 大学计算机基础教程第13章数据库技术基础
  11. 五行灵根 鸿蒙珠,异世鸿蒙武神
  12. 你认识细菌吗?一文带你读懂了解它
  13. 一款经典动漫改编的二次元日系角色扮演类手游——航海王热血航线
  14. java对服务器文件操作、获取,删除,下载
  15. 菜鸟窝出品】数据清洗、python与sklearn数据标准化实战(附项目源码)
  16. 商场节日美陈策划方案
  17. 闲看花开花落,云卷云舒
  18. 西瓜视频破解js爬虫
  19. android字体好看,Android:更好的自定义字体方案
  20. 【软件分析/静态程序分析学习笔记】2.中间表示(Intermediate Representation)

热门文章

  1. 把Ubuntu打造成Mac Macbuntu
  2. 5 重启应用_5种方法教你解除 iPhone在流量环境下,无法下载超过150M的限制!
  3. css的盒子模型以及布局(面试考点)
  4. UIButton颜色渐变 titleLabel字体不显示
  5. ES6学习笔记六(新增数据结构)
  6. C# 获取Datagridview 中ComboBox列的DisplayMember值和ValueMember值
  7. java链式语法_javaScript链式调用原理以及加法实现
  8. Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
  9. 六石管理学:夸大成绩,当事人自己是否知道
  10. 略谈永中OFFICE的语言国际化