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的时候 ...
随机推荐
- 年底Android面试整理(附答案)
面试,无非都是问上面这些问题(挺多的 - -!),聘请中高级的安卓开发会往深的去问,并且会问一延伸二.以下我先提出几点重点,是面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期, ...
- Confluence 6 手动运行和修改
手动运行一个任务 希望手动运行一个计划任务,进入计划任务的列表中,找到你希望手动运行的计划任务,在这个计划任务的边上选择 运行(Run).这个计划任务将会马上执行. 不是所有的计划任务都可以手动运行的 ...
- Confluence 6 配置默认语言界面
Confluence 6 配置默认语言使用的界面. https://www.cwiki.us/display/CONFLUENCEWIKI/Choosing+a+Default+Language
- 【Linux】添加DNS
1.添加DNS输入命令: vi /etc/resolv.conf 添加一行:nameserver 10.41.132.9 2.查看DNS nslookup 127.0.0.1 | grep Serve ...
- 【深度学习】吴恩达网易公开课练习(class1 week3)
知识点梳理 python工具使用: sklearn: 数据挖掘,数据分析工具,内置logistic回归 matplotlib: 做图工具,可绘制等高线等 绘制散点图: plt.scatter(X[0, ...
- python网络爬虫笔记(三)
一.切片和迭代 1.列表生成式 2.生成器的generate,但是generate保存的是算法,所以可以迭代计算,没有必要,每次调用generate 二.iteration 循环 1.凡是作用于for ...
- C语言访问一个链接
示例代码1: # include <Windows.h> int main(){ system("start http://""www.baidu.com&q ...
- 自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器
置顶2017年11月06日 14:41:04 阅读数:2311 这几天,任务中有一个难点是把一个打印页面自动给生成PDF文档,并且上传至服务器,然而公司框架只有手动上传文档,打印时可以保存为PDF在本 ...
- Windows Azure 部署 Windows 8 虚拟机
基本步骤其实很简单,主要有: 本地部署虚拟机 将虚拟机VHD上传至Azure 在Azure上根据VHD生成映像 利用映像生成虚拟机 下面我们开始: 1,本地部署虚拟机 首先我们需要在本地用 Hyper ...
- Json对象处理.将对象处理成dic数组.
var parser = new JsonConfigurationFileParser();var dict = parser.Parse("json"); using Newt ...