积跬步-至千里系列之二:Android中Activity的启动流程分析和总结

积跬步-至千里系列之二:Android中Activity的启动流程分析和总结

Activity是Android中的俗称的四大组件之首,在之前的使用和学习过程中,只知道简单的七个生命周期方法,和简单的常用方法的调用。
今天抽个时间来扒一扒详细的内容,自己也更深入的再次重新认识一下Activity.
声明:本文是在别人总结的基础上,借鉴别人的博客,然后自己跟踪了代码实现:http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html

一.通过跟踪代码查看startActivity到底是怎样执行的:
当我们在Activity中调用startActivity方法发起启动一个页面时
1.第一个阶段跟踪代码到startActivityFromChild方法,在该方法中会调用execStartActivity方法,其中参数中就包含intent,requestcode,应用所在主线程等参数;
2.第二步跟踪代码到execStartActivity方法中,发现在一系列的类型转换以及操作后,调用了ActivityManagerNative类的startActivity方法,我们不知道ActivityManagerNative类是干什么的,所以查看一下,通过查看发现ActivityManagerNative类其实是继承自Binder的一个类,同时实现了IActivityManager接口,刚好startActivity方法其实就是IActivityManager借口定义的方法,所以要去ActivityManagerNative作为实现类中去找。通过搜查,我们可以找到ActivityManagerNative类中有一个ActivityManagerProxy类,其也实现了IActivityManager的方法,其中就有我们要找的startActivity方法。
3.第三步跟踪代码到startActivity方法中后,查看内容,前面是一些数据读写转换,后面调用了一个transact方法,该方法是由一个名字为mRemote的IBinder对象调用的。由于IBinder是一个接口,我们如果需要查看方法具体执行内容,需要查找IBinder的实现类。
4.下一步的代码执行其实是到执行ActivityManagerService类中的onTransact方法,接下来我们需要去该类中查找。但是在Eclipse或者Studio编辑器中查看,我们并不能找到ActivityManagerService类,Google并没有将该类暴露,我们需要去源码中自己寻找查看。我查找的是Android5.1的源码,在framework/base/service/core/java/com/android/am 目录下,ActivityManagerService就在该目录下。
这里写图片描述
图片中就是onTransact()方法,接着分析该方法。在该方法中,有个ArrayList 集合procs,后面会对该集合进行遍历,然后调用其子对象的transact方法,该方法的返回值是boolean值,return super.onTransact(code, data, reply, flags);语句为该方法的返回值,调用了父类的onTransact方法,其父类是ActivityManagerNative,下一步去ActivityManagerNative中查找。
5.上一步说到执行父类ActivityManagerNative的同名方法,我们在ActivityManagerNative中找到该方法,进入该方法会发现该方法会根据行参中的code来进行分类判断执行,随便找一个case分析,会看到调用了startActivity方法,点击startActivity方法跟进,其实startActivity方法是IActivityManager中声明的一个方法,IActivityManager是一个接口,我们只能再找其实现类,进行跟踪。
6.实现了IActivityManager借口的类只有ActivityManagerNative和ActivityManagerProxy。其实ActivityManagerService继承了ActivityManagerNative类,并实现了startActivity方法,如下图:
这里写图片描述
这里写图片描述
这两个方法是挨着的,最后是在下面的方法中调用了startActivityMayWait方法, ActivityStackSupervisor mStackSupervisor对象执行该方法:
这里写图片描述
7.根据第6步中找到的信息,全局查找,在ActivityManagerService同包目录下找到该类,该方法参数特别多,返回值为int类型,如下图所示。
这里写图片描述
上文说到返回值为int,该方法返回值为一个int类型的res变量,如下图:
这里写图片描述
毫无疑问,还要找startActivityLocked方法,就在本类中就,比较方便查找。
8.下一步执行是resumeTopActivityLocked方法,在ActivityStackSupervisor中全局搜索该方法,会找到对应的方法,并没有找到该方法,继续寻找是ActivityStack对象调用的该方法,所以应该到ActivityStack类中查找该方法,如下图:
这里写图片描述
如上图,该方法返回的返回值为boolean;
9.继续执行就到了ActivityManagerService类中的startProcessLocked方法,如图:
这里写图片描述
10.接下来该方法继续执行如下的操作:
这里写图片描述
Process.start()方法,entryPoint为android.app.ActivityThread;
11.找到Process源码类,查看startViaZygote方法,如下:
这里写图片描述
12.在该方法的最后一句,如图:
这里写图片描述
该方法有两个参数,其中一个参数是执行某个方法的返回值 ,所以跟进去进行查看,如图
这里写图片描述
这里就是与LocalSocket进行了socket通信,可以更进一步查看一下connect的方法实现:
这里写图片描述
13.下一步将会执行ActivityThread的main方法,如下图:
这里写图片描述
从上图中就可以看到,有个attach方法,如下图:
这里写图片描述
从上面的截图中就可以看到,attachApplication方法会是下一步的执行方法,调用attachApplication方法的对象就是IActivityManager,还是要找其实现类,其实真正调用的实现类是ActivityManagerService类;
14到ActivityManagerService类中去查找attatchApplication方法:
这里写图片描述
15下一步要执行的方法是realStartActivityLocked方法.在5.1中的ActivityStack中并没有找到该方法,是在ActivityStackSupervisor类中的一个方法。
这里写图片描述
16.程序下一步会执行ActivityThread的scheduleLaunchActivity方法,但是在5.1中我没有找到该方法,然后会在ActivityThread中进行handleMessage,handleLaunchActivity,performLaunchActivity,再后面就是Activity的onCreate,onStart,..以及后面一系列的方法了。最后这一条的描述我并没有真正找到流程代码,只是看到别人分析的这样的流程,借鉴过来。
如上面的十几个步骤,其实走完这个流程,就感觉很困难,说明对源码还是很不熟,因为之前没有看过系统源码,这个流程也是一边自己跟代码,一遍根据别人的总结来进行浏览的。技术方面没有什么深度,看上去也比较琐碎和冗繁,下面根据自己的代码跟踪和借鉴别人的博客内容,做个总结。
总结:
从全局层面来看,管理和运行Activity的,主要涉及几个内容,分别是ActivityManagerService,ActiveThread,以及他们之间通信。首先,所有的Activity都是由ActivityManagerService来进行管理的,ActivityManagerService是一个独立的进程;其次,ActiveThread是每一个应用程序所在进程的主线程,负责循环的消息处理;再者,ActiveThread与ActivityManagerService之间会进行通信,因为他们不属于同一个进程,所以他们之间的通信属于进程间的通信,通信机制是使用Binder机制。
Activity的启动过程:可以大概分为6个过程

  • 1.使用代理模式启动到ActivityManagerService中执行;
  • 2.创建ActivityRecord到mHistory记录中;
  • 3.通过Socket通信到Zgote相关类创建Process;
  • 4.通过ApplicationThread与ActivityManagerService建立通信;
  • 5.ActivityManagerService通知ActivityThread启动Activity的创建;
  • 6.ActivityThread创建Activity加入到Activities并开始调度Activity进行执行;
    后记:里面包含的东西实在太多了,现在自己的程度也仅仅是跟踪下代码看看源码的样子。后面会再写一些关于Activity管理的帖子,专门抽时间来看看几个重要的类的API,学习下里面的设计模式和设计思想等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值