概述
昨天已经差不多写好这篇博文了,只剩下最后的总结没写,想着今早再补上去,结果忘记保存了(写的那么长竟然也能忘记保存,我挺佩服自己的)。。。按理说没保存也能在缓存里面找回来的,可是今早开电脑的时候手贱点开了360清理了一下,现在心里可苦可苦了。还好只是篇文章,不是什么重要的文件,血的教训,标记一下。今天重新写过。
关于Activity的启动流程我也是学习了挺久的了,看了很多文章。网上也有大神觉得这个很简单,不过对于我来讲还是挺难理解的,因为里面涉及到了IPC(进程间的通讯)和binder的原理,对于这块其实我还不很熟,所以先学习了IPC和binder再来研究Activity的启动流程,学习嘛,一定要学到关键的地方,要了解原理,不然很快就忘了。现在开始吧
具体分析
通常我们从一个Activity跳转到另外一个Activity,我们知道首先回调周期方法的是onPause(),之后才开始LaunchActicity。先从startActivity(intent)开始,看何时才会调用onPause(),何时调用scheduleLaunchActivity()。
先看一个在网上找的流程图,还真的有些复杂。
源码分析
Activity.class:
看下Instrumentation.class的execStartActivity方法:
进入ActivityManagerService.class的startActivity方法:
ActivityStarter.class的startActivityMayWait方法:
进入ActvityStack.class的startActivityLocked方法:
看下ActivityThead的内部类ApplicationThread.class的schedulePauseActivity方法:
终于,终于,让我们在Activity.class看到 onPause()。
ActivityManagerNative.getDefault().activityPaused(token) ——> ActivityManagerService的activityPaused(token)方法
ActivityStackactivityPausedLocked方法:
ActivityStackSupervisor中的resumeFocusedStackTopActivityLocked()方法
ActivityStack中的resumeTopActivityUncheckedLocked()方法
ActivityStackSupervisor中的startSpecificActivityLocked()方法
ActivityTheadc.class:
到了attach,这里就贴个图
成员分析
- ActivityManagerService 组件通信系统核心管理类 (ActivityManagerNative)IPC通信,管理Activity的生命周期
- Instrumentation 是android系统中启动Activity的一个实际操作类,也就是说Activity在应用进程端的启动实际上就是Instrumentation执行的
- ActivityStackSupervisor 管理整个手机的Activity任务栈
- ActivityStack Activity栈(任务栈)存放Activity,后进先出
- ActivityThread Activity的入口是onCreate方法,Android上一个应用的入口是ActivityThread。和普通的Java类一样有一个main方法。用于控制与管理一个应用进程的主线程的操作,包括管理与处理activity manager发送过来的关于activities、广播以及其他的操作请求。
总结
Activity的启动流程一般是通过调用startActivity或者是startActivityForResult来开始的,会在Instrumentation类中实现具体启动的细节(涉及到进程间的通信),与ActivityManagerService进行进程间交互。ActivityManagerService接收到应用进程创建Activity的请求之后会执行初始化操作,解析启动模式,保存请求信息等一系列操作。ActivityManagerService通过Binder进程间通信机制将当前系统栈顶的Activity执行onPause操作,ActivityManagerService将执行创建Activity的通知告知ActivityThread,然后通过反射机制创建出Activity对象,并执行Activity的onCreate方法,onStart方法,onResume方法。