从以下角度梳理
- AMS启动流程
- AMS启动一个activity
- AMS与service和broadcast的交互流程
- AMS在应用crash流程的作用
应用通过ActivityManager获取AMS的代理管理权(ActivityMangerProxy)。避免用户调用AMS的核心系统服务。
1.AMS启动流程
AMS通过systemServer启动
//frameworks/base/services/java/com/android/server/SystemServer.java
SystemServer::startBootstrapServices()
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
2.AMS启动一个activity
点击桌面一个图标启动应用为例(微信wechat)
涉及三个进程launcher、zygote、system_server、wechat
- launcher包含的ActivityMangerProxy调用system_server进程的AMS的startActivity启动activity(binder)
- AMS通过zygote进程fork一个新的进程作为weChat的进程(socket)
- weChat的进程的ActivityMangerProxy通知system_server的AMS当前程序初始化完成(binder)
- system_server的ApplicationProxy调用weChat的applicationThread的scheduletelaunchActivity的方法通知启动activity(binder)
- applicationThread通过hander、message的方法发送LAUNCH_ACTIVITY启动进程后续开始回调activity的生命周期方法(hander)
3.AMS与service和broadcast的交互流程
启动service和启动activity类似,不再描述
广播:app进程向ams注册广播, 广播发送者,通过ams发送广播,ams查询注册信息,转发广播,回调app进程的broadReceiver的onReceive方法
4.AMS在应用crash流程的作用
应用进程抛出异常,进入handleApplicationCrash,在该函数中调用AMS的crashApplication方法,弹出crash对话框,用户点击后,进入app进程的process.killprocess方法,之后AMS做清理动作