1. 入口。

以前一直都说Activity的人口是onCreate方法。其实android上一个应用的入口,应该是ActivityThread。和普通的java类一样,入口是一个main方法。

public static final void main(String[] args) {

SamplingProfilerIntegration.start();

……

Looper.prepareMainLooper();

if (sMainThreadHandler == null) {

sMainThreadHandler = new Handler();

}

ActivityThread thread = new ActivityThread();

thread.attach(false);

……

Looper.loop();

……

thread.detach();

……

Slog.i(TAG, "Main thread of " + name + " is now exiting");

}

下面仔细分析一下这个main方法。

2.Looper.prepareMainLooper();

ActivityThread其实就是我们经常说的UI thread,也就是主线程。我们都知道主线程可以使用Handler进行异步通信,因为主线程中已经创建了Looper,而这个Looper就是在这里创建的。如果其他线程需要使用Handler通信,就要自己去创建Looper。

3. sMainThreadHandler = new Handler();

创建一个Handler。

4. ActivityThread thread = new ActivityThread();

创建ActivityThread 对象。

ActivityThread 有几个比较重要的成员变量,会在创建ActivityThread对象时初始化。

(1)final ApplicationThread mAppThread = new ApplicationThread();

ApplicationThread继承自ApplicationThreadNative, 而ApplicationThreadNative又继承自Binder并实现了IApplicationThread接口。IApplicationThread继承自IInterface。这是一个很明显的binder结构,用于于Ams通信。IApplicationThread接口定义了对一个程序(linux的进程)操作的接口。ApplicationThread通过binder与Ams通信,并将Ams的调用,通过下面的H类(也就是Hnalder)将消息发送到消息队列,然后进行相应的操作,入activity的start,

stop。

(2)final H mH = new H();

private final class H extends Handler

mH负责处理ApplicationThread发送到消息队列的消息,例如:

public void handleMessage(Message msg) {

if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what);

switch (msg.what) {

case LAUNCH_ACTIVITY: {

ActivityClientRecord r = (ActivityClientRecord)msg.obj;

r.packageInfo = getPackageInfoNoCheck(

r.activityInfo.applicationInfo);

handleLaunchActivity(r, null);

} break;

5. handleLaunchActivity(r, null);

从名字中就可以看出,这里就将进行启动activity的工作了。

方法中主要调用了这一句:

Activity a = performLaunchActivity(r, customIntent);

6. performLaunchActivity()

进行了一些初始化和赋值操作后,创建activity。

activity = mInstrumentation.newActivity(

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

然后调用:

mInstrumentation.callActivityOnCreate(activity, r.state);

这一句就会调用到acitivity的onCreate方法了,就进入了大多数应用开发的入口了。

activitythread.java,ActivityThread and ApplicationThread | 学步园相关推荐

  1. java longlong_java Long long | 学步园

    在Java中执行如下的代码: long number = 26012402244; 编译的时候会出现一个错误,提示"过大的整数: 32322355744",如果在Eclipse中书 ...

  2. lotus notes java_Lotus Notes邮件开发——JAVA(2) | 学步园

    利用Notes的JAVA api发送邮件(代码片段) 最近要编写一个利用Notes自动发送邮件的程序,研究一天终于OK了``在这里跟大家分享代码 import lotus.domino.AgentBa ...

  3. java image功能_使用JAI扩展Java Image的功能 | 学步园

    Java Image功能一直都在增强,但是向磁盘写一个图像文件或者返回一个PNG或JPEG依然比较难实现.但是我们可以使用Java Advanced Imaging(JAI)API来解决这个问题.JA ...

  4. java 蚂蚁怕杆_百度面试题–5只蚂蚁走木棍问题的非递归解法(Java调试通过) | 学步园...

    致歉:之前贴的代码有bug. 题目描述: 有一根27厘米的细木杆,在第3厘米.7厘米.11厘米.17厘米.23厘米这五个位置上各有一只蚂蚁.木杆很细,不能同时通过一只蚂蚁.开始时,蚂蚁的头朝左还是朝右 ...

  5. java atomiclong 使用_每天一个Java类之AtomicLong | 学步园

    多线程是面试必被问,而且问的很深的东西啊 关于原子类,也会问到. Random中的seed是用的原子类,因此是线程安全的.但是效率不高. 来看看AtomicLong的实现 因为java的slot只有3 ...

  6. java 单纯形法_单纯形法 | 学步园

    数学最优化中,由George Dantzig发明的单纯形法(simplex algorithm)是线性规划问题的数值求解的流行技术.有一个Nelder-Mead法或称下山单纯形法,由Nelder和Me ...

  7. java桥牌发牌程序,java桥牌发牌算法 | 学步园

    参考文章: ---------------------------------------------------------------------------------------------- ...

  8. java actioncontext_Action访问ActionContext | 学步园

    在Struts2.0中,Action已经与Servlet API完全分离,这使得Struts2.0的Action具有了更加灵活和低耦合的特性,与Struts1.0相比较而言是个巨大的进步.虽然Stru ...

  9. java jce 安装_BouncyCastle JCE 的安装配置及在java中的使用 | 学步园

    安装BouncyCastle JCE应该按照如下步骤: 1)下载提供者 BouncyCastle可以从www.bouncycastle.org下载,下载后请将它解压缩. 2)将JAR文件拷贝到适当位置 ...

最新文章

  1. (20/24) webpack实战技巧:watch实现热打包和添加代码备注
  2. C 语言编程 — 堆栈与内存管理
  3. Java的char数据类型存储一个中文字符
  4. window7自带的分区
  5. VTK:Medical之MedicalDemo2
  6. Qt中文乱码解决思路
  7. 珍珠(信息学奥赛一本通-T1384)
  8. 带你自学Python系列(十三):Python函数的用法(三)
  9. ef6 oracle 存储过程,Entity Framework入门教程(14)---DbFirst下的存储过程
  10. JQuery 插件之Ajax Autocomplete(ajax自动完成)
  11. c语言实验操作期末考试怎么把试题保存,c语言上机操作练习题_相关文章专题_写写帮文库...
  12. 数据结构与算法 第一章 引入
  13. 【第三方软件】利用WIN8系统自带的绘图软件获取图像信息(位置和颜色信息)
  14. icloud与mysql_ICloud 应用实例(一)
  15. 支付宝支付原理以及测试接口获取支付url
  16. php excel水印图片大小,PHPExcel:如何在第一页标题中插入图像并将其放大以适合其内容?...
  17. 什么是大数据?什么是数据科学
  18. 英语语法---表语详解
  19. 无线遥控灯telec认证
  20. 惊艳!可视化的 js:动态图演示 - 事件循环 Event Loop

热门文章

  1. 通道缓冲(channel buffering)
  2. Vue之mixins
  3. Oracle 模糊查询表信息
  4. 爬虫工具|输入浏览器header内容字符串,自动格式化为字典类型
  5. notepad++精美主题字体
  6. thinkphp monolog日志写入失败问题解决
  7. 阿里云免费服务器申请与基本必要配置
  8. pycharm使用sqlite3数据库
  9. C++游戏开发实战视频教程
  10. keynote中绘制金字塔方法