Activity
ActivityThread
这个就是主线程,UI线程。
应用启动的时候会启动一个以包名为进程名的进程,这个进程会有这个ActivityThread线程。
Activity启动时涉及到的核心类
IActivityManager
这是本地进程调用到AMS进程(system_server)的Binder代理对象,具体的实现类是ActivityManagerService;本地进程是通过ActiviyManagerNative中的内部类ActivityManagerProxy调用AMS的具体实现的,而ActiviyManagerNative提供了ActivityManagerProxy的实例对象。
IApplicationThread
这个接口是为了AMS能够调用到应用进程的功能,从而控制应用进程以完成指定操作,那这样AMS也是需要有一个本地进程的Binder代理对象,这是就是ApplicationThreadProxy。
ActivityManagerService通过IApplicationThread接口管理应用进程,ApplicationThread类实现了IApplicationThread接口,实现了管理应用的操作,ApplicationThread对象运行在应用进程中,它其实是ActivityThread的内部类。
ApplicationThreadProxy对象是ApplicationThread对象在ActivityManagerService线程内的代理对象,ActivityManagerService通过ApplicationThreadProxy对象调用ApplicationThread提供的功能,比如让应用进程启动某个Activity。
- ActivityManagerService
ActivityManagerService管理Activity时,主要是如下几个类在起作用:
- ProcessRecord:记录应用进程的信息;
- ActivityStack:activity的堆栈
- ActivityRecord:每次启动一个Actvity会有一个对应的ActivityRecord对象,表示Activity的一个记录
- ActivityInfo:静态的activity的信息,比如启动模式等;
- TaskRecord:Task记录信息,一个Task可能有多个ActivityRecord,但是一个ActivityRecord只能属于一个TaskRecord
详细的启动流程
1、 Activity调用到ActivityManagerService
Activity和ActivityManagerService是处在不同的两个进程中,它们之间的通过通过Binder完成。
- 最开始是Launcher发出启动app的指令,触发Activity的
startActivity
等,所有的启动activity最后都是调用startActivityForResult
; startActivityForResult
会调用Instrumentation
类的execStartActivity
。这个类是对Activity的一个扩展的类,包括对ActivityResult、ActivityConfig和Activity生命周期。execStartActivity
调用IActivityManager
中的startActivity,这只是个Binder的接口。IActivityManager
的实现是在ActivityManagerNative
中的内部类ActivityManagerProxy
实现的,通过Binder的机制跟AMS进行通信,这样启动activity的请求就发给AMS,由AMS去完成下面的流程。
2、ActivityManagerService调用Zygote孵化出应用进程
ActivityManagerService运行在system_server
进程中。
ActivityManagerProxy
对象调用ActivityManagerService
对象(运行在system_server进程)的startActivity方法以启动应用,startActivity方法接下来调用startActivityAsUser
方法以启动应用。startActivityAsUser
会在ActivityStackSupervisor
和ActivityStack
里完成一些列的方法调用(并不是上图的所有流程都是在ActivityStack里完成的那样)
实际的过程应该是:
3、Zygote孵化出应用进程
zygote进程专用于孵化Android框架层和应用层程序的进程。
通过上面的已套流程逻辑,就为当前的app开启了一个新的进程。
这个进程会执行ActivityThread类的main方法
4、ActivityThread类main的逻辑 在main方法中,主要完成了2个任务:
- 准备好UI线程的Looper和消息队列,进入loop循环;
- ActivityThread的attach完成和AMS的通信,由AMS完成启动activity的任务。
5、ActivityManagerService的逻辑
这里的逻辑主要是AMS上的2个操作:
- thread.bindApplication:将应用进程的ApplicationThread对象绑定到AMS
- mMainStack.realStartActivityLocked:通知应用进程启动Activity
在第4步中,main中会调用:
ActivityThread thread = new ActivityThread(); thread.attach(false);
6、最后的启动过程
- ActivityThread的
handleLaunchActivity
调用两个函数:performLaunchActivity
handleResumeActivity
- performLaunchActivity做了如下事情:
- 对
ActivityClientRecord
信息的进一步校验 - 实例化出Activity(反射实现)
- 实例化出Application(已经实例化的就不需要了)
- 创建Context环境
- 将此Activity
attach
到Window上 - 通过Instrumentation调用
onCreate
方法 - 通过Instrumentation调用
onStart
方法 - 通过Instrumentation调用
onResotreInstanceState
方法 - 通过Instrumentation调用
onPostCreate
方法
- 对
- handleResumeActivity做了如下事情:
- 调用
performResumeActivity
触发onResume
方法 - 添加到Window,界面显示
- 调用
PS~~~~
在步骤2中,ActivityStackSupervisor
中如果走到realStartActivityLocked
,则下面的3、4、5的逻辑将不会都到,直接走到6;
启动流程的总结
在点击Launcher里的图标启动app时,会调用到AMS启动activity;在AMS发现这个应用还未启动过,即在linux系统中没有对应的进程时,它会调用Zygote进程去孵化出新的应用进程,这个进程会调用到ActivityThread的main方法;接下来通知AMS应用进程已经启动,AMS将应用进程绑定上;最后字词通过Binder调用到ActivityThread的handleLaunchActivity完成activity的启动;如果在AMS发现这个应用已经创建了进程,则直接启动activity了。
Activity Task的调度算法
TODO