Activity的启动
--摘自《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的启动的更多相关文章
- Android进阶系列之源码分析Activity的启动流程
美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...
- Android中Activity的启动模式
简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...
- 关于activity的启动模式
在Android中每个界面都是一个Activity ,界面的切换实际上是对不同Activity实例化的过程.而启动模式就决定Activity启动运行方式. 1.设置方式它是在主配置文件中,Activi ...
- 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)
1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...
- android Activity的启动模式与flag的见解
最近做一个安卓项目,想要实现的效果就是:当打开一个按钮的时候,启动了一个A功能,当用户返回到桌面再继续进去的时候,不过之前在哪个Activity,都会先跳转到A功能的那个界面,当用户点击返回的时候,再 ...
- android Activity的启动模式
Android中Activity启动模式详解 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启 ...
- Android Activity的启动过程
文章编辑的太长了,请移步我的csdn博客:http://blog.csdn.net/xyh269 Android Activity的启动过程原文链接:http://blog.csdn.net/xyh2 ...
- Activity的启动模式(android:launchMode)
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
- 4种activity的启动模式
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
- Activity的启动模式及回退栈的概念
Activity的启动模式 standard 正常模式 在创建一个新的activity的时候,直接在栈顶创建一个新的activity singleTop 顶部单个 在创建一个新的activity的时候 ...
随机推荐
- js-DOM事件
var EventUtil = { addHandler:function(elm,type,handler){//添加事件 if(elm.addEventListener){ elm.addEven ...
- Modbus库开发笔记:Modbus ASCII Master开发
这一节我们来封装Modbus ASCII Master应用,Modbus ASCII主站的开发与RTU主站的开发是一致的.同样的我们也不是做具体的应用,而是实现ASCII主站的基本功能.我们将ASCI ...
- 信息摘要算法之六:HKDF算法分析与实现
HKDF是一种特定的键衍生函数(KDF),即初始键控材料的功能,KDF从其中派生出一个或多个密码强大的密钥.在此我们想要描述的是基于HMAC的HKDF. 1.HKDF概述 密钥派生函数(KDF)是密码 ...
- Windows下Oracle 11g创建数据库
以前开发的时候用得比较多的是mysql和sql server,oracle用的比较少,用起来比较生疏,mysql和sql server用起来比较类似,就oracle的使用方式和他们不同,oracle在 ...
- 再谈树形dp
上次说了说树形dp的入门 那么这次该来一点有难度的题目了: UVA10859 Placing Lampposts 给定一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都与灯相邻(被灯照亮 ...
- hishlib 算法加密
通过hashlib MD5得到一个32的加密密码 import hashlib def getMD5(): md5 = hashlib.md5() #调用MD5加密方法 with open(path ...
- Vue+restfulframework示例
一.简单回顾vue 前不久我们已经了解了vue前端框架,所以现在强调几点: 修改源: npm config set registry https://registry.npm.taobao.org 创 ...
- 《剑指offer》从上往下打印二叉树
本题来自<剑指offer> 从上往下打印二叉树 题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 队列的思想. 先将根节点加入,当取该节点时候,依次将左右子树加入,直 ...
- WampServer & XAMPP Configure with MariaDB and MySQL
第一部分补上次的一个问题 1.WampServer 3不支持的硬件格式 FAT3和 exFAT 他只能工作在NTFS的格式硬盘上. 不能在Windows XP上运行. 安装 WampServer 必须 ...
- cf14d 树的直径,枚举删边
#include<bits/stdc++.h> using namespace std; #define maxn 300 ]; int n,head[maxn],tot,a,b,dis[ ...