AMS是Android最核心的服务,管理着四大组件的启动切换调度关闭和应用程序的管理调度工作。虽然不常见,但是经常使用到,比如Activity的启动。就Activity的启动说一下我理解的AMS工作流程。
Android有个特点,每一个应用程序都是一个独立的线程,我们常见的桌面也是一个进程,叫launcher。AMS在system_server进程中,是该进程众多线程中的一个。从桌面启动一个应用程序涉及到进程间通信,使用了Android最有特点的Binder机制,我们这里帮Binder看作一个黑盒,只知道它能完成两个进程间的通信。桌面点击一个图标,桌面所在的launcher进程会通过方法调用和Binder机制将startActivity的请求发送给SystemServer中的AMS。之后会经过六个过程:
1. 预启动:
AMS会收集源Activity和目标Activity的信息存到ActivityInfo对象中,验证目标Activity是否在Manifest中注册,查看目标Activity的启动模式以决定目标Activity在哪个栈中,然后Pause该栈栈顶Activity。
2. 暂停源Activity:
AMS进程回到Launcher进程。由handler负责通知暂停源Activity,暂停完后再通知AMS。
3. 启动目标Activity在的进程:
Launcher进程回到AMS所在进程。检查目标Activity所在的进程和运行环境是否存在,存在则复用,不存在则通知Zygote(通过socket通信)创建一个新的进程,然后classloader加载ActivityThread类,创建ActivityThread实例,ActivityThread实例再创建一个ApplicationThread并把该对象交给AMS以便于通信。
4. 加载目标Activity:
经过上面三步,我们获得了目标Activity的信息和要在的栈,有了目标Activity所在的进程和运行环境,在这一步我们才创建Activity。AMS将创建Activity的通知告知目标Activity所在进程的ActivityThread,ActivityThread加载对应的Activity类,通过反射创建目标Activity,这是目标Activity才创建出来。
5. 显示目标Activity:
创建出来目标Activity不代表结束,还需要执行Activity的onCreate方法加载界面布局和初始化工作,然后执行onStart,onResume方法。
6. 停止栈顶Activity:
在前面的步骤中,栈顶Activity已被Pause,目标Activity执行onResume后,原栈顶Activity要执行onStop。