五步掌握Activity的启动过程(非常简单)

写在前面:学习Android系统的内部实现,应该更加侧重于对整体流程的把握,而不应该深入代码细节不能自拔!

Activity的启动过程比较复杂,但是却又是非常重要的一个知识点,作为初学者很多时候看不明白,网上的分析又都是长篇大论+各种源码,看得头疼。我也是经过不懈的努力才终于对这个过程有了一个比较清晰的认识,所以想写一篇简单版的Activity启动过程文章,帮助一些刚入门不久的同学学习,这样以后去看源码详解会更加易懂。


我总结了 5 步骤,即可大致了解Activity启动过程。

我们从startActivity(intent)开始

一、

startActivity方法最终都会调用startActivityForResult方法。

在startActivityForResult方法内继续调用Instrumentation的execStartActivity方法。那么 Instrumentation是什么呢?

Instrumentation是android系统中启动Activity的一个实际操作类,也就是说Activity在应用进程端的启动实际上就是                Instrumentation执行的(不懂没关系,记住有这东西就行)。

execStartActivity的方法内有一个ApplicationThread类型的参数,ApplicationThread是ActivityThread的内部类,(立个flag)这两个东西在Activity的启动过程中发挥重要作用!


二、

进入到Instrumentation的execStartActivity方法里面。

该方法中,容易发现 Activity的启动由ActivityManagerNative.getDefault的startActivity方法完成。需要知道的是:ActivityManageService(AMS)继承自ActivityManagerNative,而且ActivityManagerNative继承自Binder并实现IActivityManager接口,因此AMS也是Binder。

而刚刚提到的ActivityManagerNative.getDefault是什么呢?就是AMS!   在ActivityManagerNative中,AMS这个对象采用单例模式对外提供,获取方法就是ActivityManagerNative.getDefault。所以我们接下来就要转去AMS的startActivity方法了。

值得一提的是:在execStartActivity中,也就是ActivityManagerNative.getDefault的startActivity方法下面,有一个方法:checkStartActivityResult方法,该方法是用来检查启动Activity的结果,无法正确启动时就会抛异常(例如Activity未注册异常就是它抛出的)。


三、

AMS的startActivity方法中,调用了ActivityStackSupervisor类的startActivityMayWait方法——>其startActivityLocked——>其startActivityUncheckedLocked方法,然后又调用了ActivityStack类的 resumeTopActivitiesLocked方法——>其resumeTopActivityInnerLocked方法,然后就再执行栈顶Activity的Pause生命周期方法,这又是一大堆方法的调用,就不细说了。


四、

ActivityStack的resumeTopActivityInnerLocked方法后,通过调用一堆方法pause了栈顶Activity后,最终又调用了ActivityStackSupervisor的startSpecificActivityLocked方法——>其realStartActivityLocked方法。

这个realStartActivityLocked方法是转折点! realStartActivityLocked方法里调用了app.thread.scheduleLaunchActivity方法,而app.thread的类型是 IApplicationThread。眼熟吗?

IApplicationThread的声明中,其内部包含了大量的Activity停止、启动的接口,所以其实现者应该都得实现这些方法!而它的实现者就是 ActivityThread中的ApplicationThread!到这,Activity的启动过程就由旧Activity的pause转到启动新Activity了。


五、

ApplicationThread通过实现IApplicationThread接口的scheduleLaunchActivity方法启动Activity。这个方法实现很简单:发生一个启动Activity的消息,交给Handler处理。这个Handler叫 H 。H内收到消息后,通过调用ActivityThread的handlerLaunchActivity方法——>再调用performLaunchActivity方法完成Activity对象的创建和启动。创建完成后,又往下执行handleResumeActivity方法,来启动新Activity的onResume这一生命周期方法!


最后、

其主要逻辑其实就是:前期准备、暂停旧Activity、准备启动新Activity、启动新Activity。

不知道这样的方式对你有没有帮助呢?

还想通过一张大图的方式来讲解,正在制作中...


如有错误的地方,请务必指出,感谢!



参考文献:

《Android开发艺术探索》

http://blog.csdn.net/qq_23547831/article/details/51224992


   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值