--摘自《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在同一个进程中,所以就不用新建一个新的进程了,这样第四步、第五步就省略掉了,其他的步骤一模一样。

Activity的启动的更多相关文章

  1. Android进阶系列之源码分析Activity的启动流程

    美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...

  2. Android中Activity的启动模式

    简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...

  3. 关于activity的启动模式

    在Android中每个界面都是一个Activity ,界面的切换实际上是对不同Activity实例化的过程.而启动模式就决定Activity启动运行方式. 1.设置方式它是在主配置文件中,Activi ...

  4. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

  5. android Activity的启动模式与flag的见解

    最近做一个安卓项目,想要实现的效果就是:当打开一个按钮的时候,启动了一个A功能,当用户返回到桌面再继续进去的时候,不过之前在哪个Activity,都会先跳转到A功能的那个界面,当用户点击返回的时候,再 ...

  6. android Activity的启动模式

    Android中Activity启动模式详解   在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启 ...

  7. Android Activity的启动过程

    文章编辑的太长了,请移步我的csdn博客:http://blog.csdn.net/xyh269 Android Activity的启动过程原文链接:http://blog.csdn.net/xyh2 ...

  8. Activity的启动模式(android:launchMode)

    在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...

  9. 4种activity的启动模式

    在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...

  10. Activity的启动模式及回退栈的概念

    Activity的启动模式 standard 正常模式 在创建一个新的activity的时候,直接在栈顶创建一个新的activity singleTop 顶部单个 在创建一个新的activity的时候 ...

随机推荐

  1. (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题

    #include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>us ...

  2. vue入手

    https://www.jianshu.com/p/dc5057e7ad0d    (最全入坑教程) http://doc.liangxinghua.com/vue-family/1.4.html(v ...

  3. 练就Java24章真经—你所不知道的工厂方法

    前言 最近一直在Java方向奋斗<终于,我还是下决心学Java后台了>,今天抽空开始学习Java的设计模式了.计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式 ...

  4. Oracle Vm VirtualBox 搭建 yum 环境

    配置本地yum库(用root用户操作) 创建挂载目录 #创建挂载目录 [root@oracle ~]# mkdir /mnt/cdrom # 查看挂载目录 [root@oracle ~]# ls /m ...

  5. Confluence 6 配置快速导航

    当在 Confluence 中的快速导航进行查找的时候(请查看 Searching Confluence)能够帮助你显示页面下拉列表和其他的项目,这个是通过查找页面标题进行比对的.在默认情况下,这个功 ...

  6. Json数据和对象互转

    1.创建UserTest类 package com.cppdy; public class UserTest { private String name; private String sex; pu ...

  7. tomcat 报错处理

    一.tomcat报错找不到资源集市 原因:tomcat的配置文件sever.xml 里的 docbase配置被Eclispe修改了 解决方法:修改回来 <Context docBase=&quo ...

  8. Workbench热水泵系统

    1.创建一个新的项目,首先新建一个station,打开platform(链接配置,端口设置,账户设置) 新建文件夹之后模板的选取从palette中选择. 第一步新建station,键入station名 ...

  9. Kali安装问题解决方案

    一.对今天安装Kalilinux  失败的原因做一个简单的总结, 1.安装之前的电脑状况,电脑配置Windows7 64位旗舰版配置,虚拟版本是VMware Workstation Pro14 ver ...

  10. Allegro PCB Design GXL (legacy) 由零散的对象构成一个Shape

    Allegro PCB Design GXL (legacy) version 16.6-2015 从DXF文件中导入板框之后,发现板框是由Line Segment.Arc Segment等对象组成, ...