Activity启动过程笔记

为准备面试,将最近所复习的内容以博客的形式保存起来,方便以后的查询

本文参考老罗的文章http://blog.csdn.net/luoshengyang/article/details/6703247整理,由于老罗的这篇文章源码比较老,本文同时也参照结合主席的书。


好了,开始学习吧,我们从调用Activity的startActivity说起。

         调用ActivitystartActivity实际是内部是调用了startActivityForResult.而在startActivityForResult内部是调用了InstrumentationexecStartActivityexecStartActivity内部调用AmSstartActivityBinder机制)。AmS执行startActivity期间先做一些与栈相关的工作(获取要启动Activity相关信息ActivityRecord,栈的创建、检查权限等等)。

AmSstartActivity调用过程如下:

----ActivityStackSupervisor.startActivityMayWait(直接调用,没有其他代码):从Intent里解析需要启动的Activity的相关信息。如:包名、类名。相关信息存在ResolveInfo类中,通过该类里面得到ActivityInfo对象。

----ActivityStackSupervisor.startActivityLocked:通过传入的caller形参(IApplicationThread类型,从Activity的startActivity函数就开始一个个函数调用传入)得到调用者进程相关信息,保存到callerApp(ProcessRecord类型)变量中,然后创建要启动的Activity相关信息。保存到r(ActivityRecord)变量中。

----ActivityStackSupervisor.startActivityUncheckedLocked:获取Activity的启动模式、判断要启动的Activity是否在栈顶、得到Activity加载的栈。

----ActivityStack.resumeTopActivitiesLocked:确保被调用的Activity所在的栈处于顶端。

----ActivityStack.resumeTopActivityInnerLocked:判断要启动的Activity所在的栈是否对当前用户不可见,如果不可见就不需要继续执行下去,因为即使把这个Activity启动起来,用户也看不见,还不如先把它保存起来,等到下次可见的时候再启动。若可见,则继续执行。把要启动的Activity添加到栈顶。

----ActivityStackSupervisor.startSpecificActivityLocked:主要跟要启动的Activity进程相关。如判断所再进程是否已经运行、判断是否另开进程。如果没有指定新进程,即直接用默认进程,则直接调用realStartActivityLocked。

----ActivityStackSupervisor.realStartActivityLocked:通过Binder驱动进入到ApplicationThread的scheduleLaunchActivity函数。

 

      做完这些工作,AmS通过BinderApplicationThread(是个Binder对象)的scheduleLaunchActivity . ApplicationThread通过消息机制控制Activity生命周期。

阅读更多

扫码向博主提问

huachao1001

博客专家

非学,无以致疑;非问,无以广识
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。转载请注明转自:https://blog.csdn.net/huachao1001 https://blog.csdn.net/huachao1001/article/details/51394483
文章标签: Activity 启动 Binder
个人分类: 学习笔记
想对作者说点什么? 我来说一句
相关热词

没有更多推荐了,返回首页

关闭
关闭
关闭