AMS(ActivityManagerService)

在SystemServer的进程中,是SystemServer中的一个对象;

作用:

  1. 管理activity的生命周期
  2. 启动activity
  3. 与PMS进行交互

  Activity->AMS:

  1. 调用activity.startActivity()
  2. 通过ActivityManage.getService("activity")得到AMS的BpBinder;
  3. 通过BpBinder发送请求,调用AMS的startActivity()

AMS->PMS:

  1. AMS和PMS都在SystemServer进程中,都是SystemServer中一个对象
  2. 通过包名和PMS里的缓存mPackage查询到App对应的Package
  3. 使用activity的类名通过PMS里的内部类PackageManagerInternalImpl查询到activity对应的包装类ResolveInfo; ps:ResolveInfo这个javabean里有activityInfo、ServiceInfo等变量,查询啥就给哪个变量赋值,再返回ResolveInfo;
  4. 得到ResolveInfo里的activityInfo;
  5. 将activityInfo返回给App进程的ActivityThread;
  6. ActivityThread中发送事件
  7. ActivityThread中的Handler对象mH收到159事件,处理
  8. 通过反射创建Activity对象
  9. 将Activity对象放到activtes启动记录中

Android 11 framework 模块编译 android framework 源码_App

Android 11 framework 模块编译 android framework 源码_android_02

ActivityThread

  1. 每个应用有一个ActivityThread;是应用的入口;
  2. 在APP进程中
  3. 是AMS的缓存中心
  4. ActivityThread中的List<ActivityRecord> activtes放了activity的启动记录

ActivityThread中重要的对象:

  1. ApplicationThread:AMS回调给ActivityThread数据的桥梁
  2. mInstrumentation:管理Application和Activity的生命周期(及创建)
  3. mH:Handler,处理ApplicationThread里各种回调函数发送的各种消息

 点击桌面App图标发生了什么?

  1. 点击的APP图标是在单独的Luancher进程,是一个系统App进程
  2. Luancher进程请求SystemServer进程中的AMS去创建应用的根Activity(AndroidMnifest.xml中initen-fifter为Luanche的activity)
  3. AMS通过包名让PMS查询到相关应用信息,得到应用的Package;
  4. AMS创建activity栈,根据Package拿到根activity的配置节点信息,放到栈中,此时栈中只有一个根activity的配置节点信息,也就是在栈顶;(此处的栈不是应用层的栈,这个栈只是用来放activity节点信息的)
  5. AMS请求zygote进程创建App进程;zygote进程比较特殊, 使用Socket通信,而不是binder;zygote是所有应用的孵化器,zygote进程挂掉时,手机会自动重启;
  6. zygote进程去fork出App进程;
  7. APP进程中的主线程调用ActivityThread.main()静态函数,main中创建 ActivityThread对象
  8. 接着在ActivityThread.attch()中创建了一个ApplicationThread对象,作为和AMS通信时,返回结果的桥梁;
  9. App进程通过AMS的binder调用attachApplication(thread)请求AMS获取应用对应的Applaction和栈顶中activity节点信息(步骤4),此时给AMS传过去了一个thread,这个thread就是ApplicationThread
  10. AMS将从PMS查到的application节点数据序列化后,调用thread.bindApplaction(data数据...)传给ActivityThread;    (此时代码还会继续往下执行,去获取栈顶activity的节点信息)
  11. ActivityThread调用sendMessage发送消息BIND_APPLICATION(110)给Handler,Handler调用handleBindApplication(data)
  12. 通过反射实例化Instrumentation对象:负责application和activity的生命周期的管理
  13. 通过Instrumentation对象反射实例化new Applaction对象app
  14. 调用Instrumentation.callApplactionOnCreate(app)
  15. 执行Applaction.onCreate()
  16. 步骤10中AMS继续向下执行查找activity,AMS将查到的栈顶根Activity(LaunchActivity )信息封装到一个事务ClientTransaction中,提交事务并执行,在执行中,调用thread.scheduleTransaction(事务数据);(thread为ActivityThread中的ApplicationThread)
  17. 在ApplicationThread回调scheduleTransaction函数中,发送EXECUTE_TRANSACTION(159)消息
  18. Handler处理EXECUTE_TRANSACTION消息,从事务数据中取出LaunchActivity信息,并调用hanldeLaunchActivity(activity数据)
  19. 通过Instrumentation对象反射实例化newActivity()出对象activity
  20. 执行activity.attach(),在attach中创建WMS的桥接代理类;(绘制流程会用到)
  21. 通过Instrumentation调用callActivityOnCreate(activity)
  22. 执行Activty.onCreate();
  23. 至此启动页根Activity启动完成;

下图中4-5中少了上面7-23的步骤:

7-15创建并启动了Application;

16-22创建并启动了Activity;

Android 11 framework 模块编译 android framework 源码_App_03

应用内activity与activity的跳转是跨进程通信,还是同一个进程内通信?

是跨进程通信;

跳转流程参考上面的:省去了application的创建过程;