AMS(ActivityManagerService)
在SystemServer的进程中,是SystemServer中的一个对象;
作用:
- 管理activity的生命周期
- 启动activity
- 与PMS进行交互
Activity->AMS:
- 调用activity.startActivity()
- 通过ActivityManage.getService("activity")得到AMS的BpBinder;
- 通过BpBinder发送请求,调用AMS的startActivity()
AMS->PMS:
- AMS和PMS都在SystemServer进程中,都是SystemServer中一个对象
- 通过包名和PMS里的缓存mPackage查询到App对应的Package
- 使用activity的类名通过PMS里的内部类PackageManagerInternalImpl查询到activity对应的包装类ResolveInfo; ps:ResolveInfo这个javabean里有activityInfo、ServiceInfo等变量,查询啥就给哪个变量赋值,再返回ResolveInfo;
- 得到ResolveInfo里的activityInfo;
- 将activityInfo返回给App进程的ActivityThread;
- ActivityThread中发送事件
- ActivityThread中的Handler对象mH收到159事件,处理
- 通过反射创建Activity对象
- 将Activity对象放到activtes启动记录中
ActivityThread
- 每个应用有一个ActivityThread;是应用的入口;
- 在APP进程中
- 是AMS的缓存中心
- ActivityThread中的List<ActivityRecord> activtes放了activity的启动记录
ActivityThread中重要的对象:
- ApplicationThread:AMS回调给ActivityThread数据的桥梁
- mInstrumentation:管理Application和Activity的生命周期(及创建)
- mH:Handler,处理ApplicationThread里各种回调函数发送的各种消息
点击桌面App图标发生了什么?
- 点击的APP图标是在单独的Luancher进程,是一个系统App进程
- Luancher进程请求SystemServer进程中的AMS去创建应用的根Activity(AndroidMnifest.xml中initen-fifter为Luanche的activity)
- AMS通过包名让PMS查询到相关应用信息,得到应用的Package;
- AMS创建activity栈,根据Package拿到根activity的配置节点信息,放到栈中,此时栈中只有一个根activity的配置节点信息,也就是在栈顶;(此处的栈不是应用层的栈,这个栈只是用来放activity节点信息的)
- AMS请求zygote进程创建App进程;zygote进程比较特殊, 使用Socket通信,而不是binder;zygote是所有应用的孵化器,zygote进程挂掉时,手机会自动重启;
- zygote进程去fork出App进程;
- APP进程中的主线程调用ActivityThread.main()静态函数,main中创建 ActivityThread对象
- 接着在ActivityThread.attch()中创建了一个ApplicationThread对象,作为和AMS通信时,返回结果的桥梁;
- App进程通过AMS的binder调用attachApplication(thread)请求AMS获取应用对应的Applaction和栈顶中activity节点信息(步骤4),此时给AMS传过去了一个thread,这个thread就是ApplicationThread
- AMS将从PMS查到的application节点数据序列化后,调用thread.bindApplaction(data数据...)传给ActivityThread; (此时代码还会继续往下执行,去获取栈顶activity的节点信息)
- ActivityThread调用sendMessage发送消息BIND_APPLICATION(110)给Handler,Handler调用handleBindApplication(data)
- 通过反射实例化Instrumentation对象:负责application和activity的生命周期的管理
- 通过Instrumentation对象反射实例化new Applaction对象app
- 调用Instrumentation.callApplactionOnCreate(app)
- 执行Applaction.onCreate()
- 步骤10中AMS继续向下执行查找activity,AMS将查到的栈顶根Activity(LaunchActivity )信息封装到一个事务ClientTransaction中,提交事务并执行,在执行中,调用thread.scheduleTransaction(事务数据);(thread为ActivityThread中的ApplicationThread)
- 在ApplicationThread回调scheduleTransaction函数中,发送EXECUTE_TRANSACTION(159)消息
- Handler处理EXECUTE_TRANSACTION消息,从事务数据中取出LaunchActivity信息,并调用hanldeLaunchActivity(activity数据)
- 通过Instrumentation对象反射实例化newActivity()出对象activity
- 执行activity.attach(),在attach中创建WMS的桥接代理类;(绘制流程会用到)
- 通过Instrumentation调用callActivityOnCreate(activity)
- 执行Activty.onCreate();
- 至此启动页根Activity启动完成;
下图中4-5中少了上面7-23的步骤:
7-15创建并启动了Application;
16-22创建并启动了Activity;
应用内activity与activity的跳转是跨进程通信,还是同一个进程内通信?
是跨进程通信;
跳转流程参考上面的:省去了application的创建过程;