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的时候 ...
随机推荐
- windows Sever 2012下Oracle 12c安装配置方法图文教程
windows Sever 2012下Oracle 12c安装配置方法图文教程 Oracle 12c安装配置方法图文教程,具体内容如下 1.我们开启虚拟机 2.Windows Sever 2012启动 ...
- Django项目的创建及基本使用
安装步骤 Django是Python进行Web开发的框架,目前应用比较广泛.使用python进行Web开发,能够很快的搭建所需的项目,可以运用于原型开发,也可以部署到实际的应用环境. 使用Django ...
- SpringCloud服务提供者
服务提供者就是提供一个服务暴露出来给别人调用,在springcloud中需要注册服务到服务中心 搭建服务提供者项目(ProduceDemo) 1.创建pom.xml <project xmlns ...
- day14 迭代器 生成器 面向过程思想
"" 迭代器 什么是迭代器(iterator) 器指的某种工具, 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.1 再1.2 迭代的目的是要根据上一个结果,产 ...
- mybatis的批量删除操作
需求描述:将符合某条件的几条记录删除 解决思路:对于多个id,可以使用sql关键词 in ,只要满足数据库的id在你的id集合或者list中,就删除,从而实现批量删除.循环delete方法是在是low ...
- bzoj 3191
非常好的一道题 看到这道题,肯定能想到概率dp,但是状态的设计与转移都是一个难点 如果正向模拟来设计状态,那么不难发现是很难以转移的 所以我们考虑反向模拟,用类似博弈的方法来转移 不难发现,如果只剩了 ...
- vue @click 使用三目运算(实现动态更换绑定的函数)
转载:https://www.jianshu.com/p/ea4471c9f333 @click 错误写法 @click="dialogStatus=='create'?createData ...
- Python 读写excel类
#-*- coding: utf8 -*- import xlrd import xlwt from Public import GlobalClass def openexcel(path): tr ...
- AI学习吧-REDIS-常识
Redis 是一个non-sql,非关系型数据库,数据存放在内存中,支持持久化,redis中的数据会在一段时间内和(mysql等数据库)磁盘进行同步,防止丢失,这样也就降低了读数据效率. Redis和 ...
- 学习Maven POM
什么是POM POM stands for "Project Object Model".It is an XML representation of a Maven projec ...