android app入口函数,Android App程序运行过程 ActivityThread.main()------详解系列(一)...
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()------详解系列(一)...相关推荐
- android 删除文件函数,Android updater
这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...
- 习题 11.1 将例11.1的程序片断补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上。。
C++程序设计(第三版) 谭浩强 习题11.1 个人设计 习题 11.1 将例11.1的程序片断补充和改写成一个完整.正确的程序,用公用继承方式.在程序中应包括输入数据的函数,在程序运行时输入num, ...
- 习题 11.1 将例11.1的程序片断补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值。
习题 11.1 将例11.1的程序片断补充和改写成一个完整.正确的程序,用公用继承方式.在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个 ...
- Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送
Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!...
Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
- 内存管理——程序运行过程中内存的作用以及如何与cpu、os交互
今年以来,内存条价格暴涨,已经跃升为新的新一代理财产品,所以今天就和大家讨论一下内存条的话题,主要内容就是在程序运行过程中,内存的作用以及如何与CPU,OS交互. 我们先来讨论:计算机的运行究竟是在做 ...
- Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)
文章大纲 引言 一.Android Storage Access Framework 二.Storage Access Framework 的主要角色成员 1.Document Provider 文件 ...
最新文章
- hdu 1789 Doing Homework again
- cordova打开文件_Cordova开发App入门(四)打开及下载第三方App
- ORACLE如何一次性修改用户连接数?
- vendor自动恢复_push文件到system分区,重启后文件会被自动恢复
- 怎么修剪_杏树怎么育苗?怎么修剪怎么防治病虫害?
- git学习-pull命令
- OpenCV总结:图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
- 9.react 从入门到放弃
- 使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决
- 大学计算机基础教程第13章数据库技术基础
- 五行灵根 鸿蒙珠,异世鸿蒙武神
- 你认识细菌吗?一文带你读懂了解它
- 一款经典动漫改编的二次元日系角色扮演类手游——航海王热血航线
- java对服务器文件操作、获取,删除,下载
- 菜鸟窝出品】数据清洗、python与sklearn数据标准化实战(附项目源码)
- 商场节日美陈策划方案
- 闲看花开花落,云卷云舒
- 西瓜视频破解js爬虫
- android字体好看,Android:更好的自定义字体方案
- 【软件分析/静态程序分析学习笔记】2.中间表示(Intermediate Representation)
热门文章
- 把Ubuntu打造成Mac Macbuntu
- 5 重启应用_5种方法教你解除 iPhone在流量环境下,无法下载超过150M的限制!
- css的盒子模型以及布局(面试考点)
- UIButton颜色渐变 titleLabel字体不显示
- ES6学习笔记六(新增数据结构)
- C# 获取Datagridview 中ComboBox列的DisplayMember值和ValueMember值
- java链式语法_javaScript链式调用原理以及加法实现
- Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
- 六石管理学:夸大成绩,当事人自己是否知道
- 略谈永中OFFICE的语言国际化