概述
AMS管理者四大组件 Activity Service BrocastCast ContentProvider,AMS与四大组件之间通过Binder通信,AMS作为服务端。
Context家族
Service
BroadcastReceiver
ContentProvider
Activity启动流程
简化口述版
- Launcher进程中:【图标】被点击,Launcher进程向AMS发起【启动某个Activity】(附带信息)的Binder请求
- AMS进程中:【保存Activity信息】,向Launcher进程发起【暂停的Binder请求】
- Launcher进程中:【调用onPause】暂停自己,并发起Binder请求告诉AMS我暂停了
- AMS进程中:检查Launcher是否已暂停;检查Activity栈,存在Activity所在进程则直接启动(直接跳7),不存在则启动一个新进程并传送一些信息【ActivityThread就是主线程,代表了一个App应用,AMS通过调用Process.start(“android.app.ActivityThread”)启动一个新进程ActivityThread,并以ActiivtyThread.main为入口】。
- 新进程中:ActivityThread.main中会创建消息循环Looper、创建Application等各种初始化工作,然后向AMS发送请求表示新进程已经启动初始化完毕
- AMS进程中:保存新进程信息ProcessRecord、ActivityRecord等。向新进程发起Binder请求,传送要启动的Activity等信息
- 新进程中:利用LoadedAPK加载APK资源,调用handleLaunchActivity启动Activity【handleLaunchActivity做了三件事:Instrumentation.newActivity创建Activity实例,创建Context对象与Activity关联;Instrumentation.callActivityOnCreate调用onCreate】
Service启动流程
简化口述版【左图启动Service】
- App进程中:把要启动的Service信息发送给AMS
- AMS进程中:用ServiceRecord保存Service信息,检查Manifest中的声明,检查启动Service的进程是否存在,存在走5,不存在则创建新进程
- 新进程:ActivityThread.main中会创建消息循环Looper、创建Application等各种初始化工作,然后向AMS发送请求表示新进程已经启动初始化完毕
- AMS进程:接收到ActivityThread对象,改造为ApplicationThreadProxy,把要启动的Service信息发送给新进程
- 新进程:调用handleCreateService启动Service。
简化口述版【绑定Service】
- App进程:把要绑定的Service信息发送给AMS
- AMS进程:用ServiceRecord保存Service信息,检查Manifest中的声明,检查启动Service的进程是否存在,存在走5,不存在则创建新进程
- 新进程:ActivityThread.main中会创建消息循环Looper、创建Application等各种初始化工作,然后向AMS发送请求表示新进程已经启动初始化完毕
- AMS进程:接收到ActivityThread对象,改造为ApplicationThreadProxy,把要启动的Service信息发送给新进程,【此处会发送两个消息,一个是启动一个是绑定】
- 新进程:收到启动消息,启动Service
- 新进程:收到绑定消息,绑定Service并把Binder返回给AMS
- AMS进程:收到Binder对象返回给App
- App进程:收到Binder对象,可以进行使用