ActivityThread的main方法究竟做了什么?

来源:互联网 发布:大数据团队功能 编辑:程序博客网 时间:2024/05/16 12:33


大家早上好,新的一周又开始了。


本篇来自 MeloDev 的投稿,带大家梳理了一遍ActivityThread中的main方法,希望能够帮助到大家。


MeloDev 的博客地址:

http://www.jianshu.com/users/f5909165c1e8


写在前面


在暴雨天能去上课的都是好学生,能去上班的都是游泳运动员~



轻松一下


问大家一个问题:


Android中一个应用程序的 真正入口 是什么?


无论你知道不知道,别着急回答,再问大家一个问题:


Android不能像java一样直接跑在 main 方法的原因是什么?


Android应用程序的载体是 APK文件,它本质上,是一个资源和组件的容器,APK文件 和我们常见的 可执行文件 的区别在何处?


每个可执行文件运行在一个进程中,但是APK文件可能运行在一个单独的进程,也可以和其他APK运行在同一进程中,结合上面,我想表达的是:


Android系统的设计理念就是弱化进程,取而代之是组件的概念。


但是我们都知道,Android系统 基于 Linux系统 之上,而Linux系统的运行环境恰恰就是由进程组成。所有的Android应用进程都是由 Zygote进程 fork出来的,因此构成进程的地层系统、虚拟机、动态库等,都是相同的。


当然Android除了继承从 Zygote 中得到的某些基础的“家当”之外,Android还需要在应用的 Java层 建立一套框架来管理运行的组件。由于每个应用的配置都不相同,因此不能在 Zygote 中完全建立好再继承,只能在应用启动时创建。


这套框架就构成了Android应用的基础。


而这套框架有很多核心类,比如:


ActivityThread、ApplicationThread、Context、ActivityManagerService 等等。这里我先给自己挖一个坑,将来慢慢填上,争取清晰简洁的给大家讲明白 Android的组件管理


而今天,我们现在聊聊 ActivityThread的main方法


ActivityThread


好像忘了点什么。。。


对对,回头看看,我们还有两个问题没解答呢,整个Android应用进程的体系非常复杂,而 ActivityThread 是真正的核心类,它的main方法,是整个应用进程的入口


而第二个问题,相信你心里肯定知道大概怎么回答,我们的一个Android应用程序可以是理解为是 四大组件和各种资源的集合,它需要各种各样的环境资源,当然不能像Java直接跑在main方法里面。


而今天我们就来看看 ActivityThread的main方法 究竟做了些什么。


在此之前,安利一个看源码的网站,非常不错:


http://grepcode.com


进去点击类名就可以查看源码了:



成员变量


ActivityThread 的源码有5000多行,显然我没能力弄懂它每一行代码的意思,不过我们只要知道它大体上负责着什么功能和职责,就可以了。


看看上图中的成员变量,在给大家上一个图,就能理解 ActivityThread管理着什么



ActivityThread类的对象的关联图


从图中可以知道,mActivities、mServices和mProviderMap 这三个变量都被保存在 ArrayMap 之中,他们分别保存了应用中所有的 Activity对象、Services对象、和ContentProvider对象。 咦?同为四大组件的 BroadcastReceive 去哪里了?注意,BroadcastReceiver 对象没有必要用任何数据结构来保存,因为 BroadcastReceiver 对象的生命周期很短暂,属于我调用它时,再创建运行,因此不需要保存 BroadcastReceiver 的对象。


我们都知道应用中 Applicaiton 对象是唯一的,而 mInitialApplication 变量恰恰是 Application 对象。当你的应用自定义一个派生 Applicaiton 类,则它就是 mInitialApplication 了。


ApplicationThread 类型变量 mAppThread 是一个 Binder 实体对象,ActivityManagerService 作为 Client调用 ApplicationThread 的接口,目的是用来调度管理 Activity,这个我们未来会细说。


变量 mResourcesManager 管理着应用中的资源。


一口气说了这么多,怎么样,ActivityThread 是不是相当于一个CEO,管理调度着几乎所有的 Android应用进程的资源和四大组件


上面非常多的问题我未来会给大家慢慢解答,因为篇幅太长反而会影响阅读和知识的吸收,话不多说,来看看入口方法main都做了些什么


ActivityThread的main方法


感兴趣的同学去刚才给出的网站上搜搜 ActivityThread 类,大致浏览一下,这里先贴出 main 方法的代码:





代码并不多,但是条条关键,这些操作我都为大家写了注释,看一下就知道程序在做什么。




这几行代码拿出来单独讲解一下,首先 Looper.prepareMainLooper():是为主线程创建了 Looper,然后 thread.getHandler():是保存了主线程的 Handler,最后 Looper.loop():进入消息循环。


如果不了解Android的消息机制,大家可以来看看以前我写的文章来了解一下:


Android消息机制详解

http://www.jianshu.com/p/fad4e2ae32f5


马上就要大功告成了,最后还剩下一行代码还没解释:


thread.attach(false);


继续跟进 attach 方法,一探究竟:



当传入的参数为 false 时,就走到了如上面贴出的代码中:


此时主要完成两件事:


第一件事:调用 RuntimeInit.setApplicationObject() 方法,把对象 mAppThread(Binder)放到了 RuntimeInit中的静态变量 mApplicationObject 中。




mAppThread 的类型是 ApplicationThread,它是 ActivityThread 的成员变量,定义和初始化如下:


final ApplicationThread mAppThread = new ApplicationThread();


第二件事:比较关键了,就是调用 ActivityManagerService attachApplication() 方法,将 mAppThread 作为参数传入 ActivityManagerService,这样 ActivityManagerService 就可以调用 ApplicaitonThread 的接口了。这与我们刚才说的,ActivityManagerService 作为 Client端 调用 ApplicaitonThread 的接口管理 Activity,就不谋而合了。


写在后面


本文我们明白了 ActiivtyThread 作为进程的核心类它都管理着哪些对象,并且解释了 程序真正入口 ActivityThread的main方法 都完成了哪些重要的操作,之后会继续带大家了解相关共同组成Android应用进程的核心类,如果有问题和疑问可以多交流,毕竟我也是边学习边整理总结嘛~






如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。


欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:


阅读全文
0 0
原创粉丝点击