--摘自《android插件化开发指南》

1.AMS管理着四大组件

2.为什么Hook不能在AMS那边?因为AMS属于android系统,android系统可以被Hook,那就是病毒了。四大组件被Hook,只会影响某一个app

3.手机屏幕就是一个Activity,所在的app被称为Launcher,是由手机厂商提供的

4.Android app的main函数在ActivityThread里面

5.如果写了个Activity而忘记在AndroidManifest中申明,就会抛出Activity not found的错误,是因为AMS做的检查。不管是新启动一个app的首页,还是在app内部跳转activity,都会做这个检查

第一步:

Launcher通知AMS要启动的app和首页activity

Launcher.startActivitySafely() -->  Activity.startActivity() -->  Activity.startActivityForResult()  -->  instrumentation.execStartActivity() -->  ActivityManagerNative.startActivity() -->  ActivityManagerProxy.startActivity()

 第二步:

AMS通知Launcher已经收到启动信息

因为第一步中Launcher所在进程已经传给AMS,AMS保存为一个ActivityRecord对象,这个对象里面有一个ApplicationThreadProxy,就是Binder代理对象,它的binder真身,就是ApplicationThread

所以,AMS通过ApplicationThreadProxy发送消息,而App端则通过ApplicationThread来接收这个消息

 第三步:

Launcher告诉AMS知道了

这一步中,APT接收到来自AMS的消息后,调用ActivityThread的sendMessage方法,想Launcher主线程消息队列发送一个PAUSE_ACTIVITY消息

前三步是Launcher和AMS相互之间的跨进程通信,很类似网络协议通信的三次握手

第四步:

接下来就是AMS和待启动app之间的通信了

因为待启动的app不在后台进程,所以要启动一个新的进程。调用Process.start(),并指定ActivityThread的main函数为入口函数

第五步:

启动一个新进程,为这个进程创建ActivityThread对象(UI线程)

1)创建一个主线程Looper,即MainLooper

2)创建Application

最后AMS收到这个新的ActivityThread对象,登记成功

第六步:

AMS把传入的ActivityThread对象转为一个ApplicationThread对象,用于和这个app跨进程通信。AMS找到第二步中保存的启动首页的信息,告诉新的app

第七步:

app通过APT接受AMS的消息,通过H的handleMessage发送的消息类型是LAUNCH_ACTIVITY

handleLaunchActivity方法做的事

1)通过Instrumentation的newActivity方法,创建要启动的Activity实例

2)为这个Activity创建一个Context对象,与Activity关联

3)通过Instrumentation的callActivityOnCreate方法,执行Activity的onCreate方法

好了,简单总结一下流程

1.Launcher通知AMS要启动的app和首页activity

2.AMS通知Launcher已经收到启动信息

3.Launcher告诉AMS知道了

4.AMS启动一个新的进程

5.AMS为新进程创建一个主线程

6.AMS告诉新的app该启动哪个Activity

7.app启动首页

其中1/2/3/6都是跨进程通信

另外,如果是App内部的页面跳转,因为AMS在第四步时会发现要启动的Activity和前一个Activity在同一个进程中,所以就不用新建一个新的进程了,这样第四步、第五步就省略掉了,其他的步骤一模一样。

最新文章

  1. 问题解决_WCF_WCF 接收我服务的 HTTP 响应时发生错误
  2. JDBC 工具类
  3. Appium+Robotframework实现Android应用的自动化测试-5:RIDE中AppiumLibrary的配置
  4. setw()函数
  5. Hibernate 检索方式
  6. finished with non-zero exit 添加v7包报错的问题
  7. Entity Framework的核心 – EDM(Entity Data Model) 一
  8. 查看Linux主机CPU及内存信息
  9. 关于Comparator和Comparable
  10. ListView之ArrayAdapter
  11. ANDROID L——Material Design综合应用(Demo)
  12. ZOJ 1171 Sorting the Photos
  13. 二叉树的递归遍历 The Falling Leaves UVa 699
  14. MYSQL数据库增量备份
  15. Glibc堆块的向前向后合并与unlink原理机制探究
  16. HTML语言
  17. 查找被占用的端口的服务并kill掉
  18. slam学习资源
  19. SQL 报表 --简易进销系统
  20. Training Logisches Denken

热门文章

  1. 转:如何在Vue项目中使用vw实现移动端适配
  2. SwipeRefreshLayout,用最少的代码定制最美的上下拉刷新样式
  3. Oracle11g 启动数据库实例、关闭数据库实例
  4. ionic3 隐藏子页面tabs
  5. 【kafka】confluent_kafka重置offset
  6. Python实战一
  7. C语言访问一个链接
  8. appium 手势
  9. shell 按序删除文件
  10. MongoDB C#驱动给内嵌list添加数据