深入理解Activity启动流程(二)–Activity启动相关类的类图
本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接
本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究。
在介绍Activity的详细启动流程之前,先为大家介绍Activity启动时涉及到的类,这样大家可以有大概的了解,不至于在细节中迷失。
- 深入理解Activity启动流程(一)--Activity启动的概要流程
- 深入理解Activity启动流程(三)--Activity启动的详细流程1
- 深入理解Activity启动流程(三)--Activity启动的详细流程2
- 深入理解Activity启动流程(四)--Activity Task的调度算法
Activity启动时涉及到的类有IActivityManager相关类, IApplicationThread相关类, ActivityManagerService相关类。
IActivityManager相关类
点击图片可看大图
Activity的管理采用binder机制,管理Activity的接口是IActivityManager. ActivityManagerService实现了Activity管理功能,位于system_server进程,ActivityManagerProxy对象是ActivityManagerService在普通应用进程的一个代理对象,应用进程通过ActivityManagerProxy对象调用ActivityManagerService提供的功能。应用进程并不会直接创建ActivityManagerProxy对象,而是通过调用ActiviyManagerNative类的工具方法getDefault方法得到ActivityManagerProxy对象。所以在应用进程里通常这样启动Activty:
1 |
ActivityManagerNative.getDefault().startActivity() |
IApplicationThread相关类
点击图片可看大图
应用进程需要调用ActivityManagerService提供的功能,而ActivityManagerService也需要主动调用应用进程以控制应用进程并完成指定操作。这样ActivityManagerService也需要应用进程的一个Binder代理对象,而这个代理对象就是ApplicationThreadProxy对象。
ActivityManagerService通过IApplicationThread接口管理应用进程,ApplicationThread类实现了IApplicationThread接口,实现了管理应用的操作,ApplicationThread对象运行在应用进程里。ApplicationThreadProxy对象是ApplicationThread对象在ActivityManagerService线程 (ActivityManagerService线程运行在system_server进程)内的代理对象,ActivityManagerService通过ApplicationThreadProxy对象调用ApplicationThread提供的功能,比如让应用进程启动某个Activity。
ActivityManagerService相关类
点击图片可看大图
ActivityManagerService管理Activity时,主要涉及以下几个类:
- 1)\tActivityManagerService,它是管理activity的入口类,聚合了ProcessRecord对象和ActivityStack对象
- 2)\tProcessRecord,表示应用进程记录,每个应用进程都有对应的ProcessRecord对象
- 3)\tActivityStack,该类主要管理回退栈
- 4)\tActivityRecord,每次启动一个Actvity会有一个对应的ActivityRecord对象,表示Activity的一个记录
- 5)\tActivityInfo,Activity的信息,比如启动模式,taskAffinity,flag信息(这些信息在AndroidManifest.xml里声明Activity时填写)
- 6)\tTaskRecord,Task记录信息,一个Task可能有多个ActivityRecord,但是一个ActivityRecord只能属于一个TaskRecord
注意:
ActivityManagerService里只有一个ActivityStack对象,并不会像Android官方文档描述的一样,每个Task都有一个activity stack对象。ActivityStack管理ActivityRecord时,不是下面这样组织ActivityRecord的:
1 2 |
List<TaskRecord> taskList; //ActivityStack类 List<ActivityRecord> recordList;// TaskRecord类 |
而是像下面这样组织ActivityRecord:
1 2 |
ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>(); //ActivityStack类里 TaskRecord task; // ActivityRecord类里 |
也就是说ActivityManagerService组织回退栈时以ActivityRecord为基本单位,所有的ActivityRecord放在同一个ArrayList里,可以将mHistory看作一个栈对象,索引0所指的对象位于栈底,索引mHistory.size()-1所指的对象位于栈顶。
但是ActivityManagerService调度ActivityRecord时以task为基本单位,每个ActivityRecord对象都属于某个TaskRecord,一个TaskRecord可能有多个ActivityRecord。
ActivityStack没有TaskRecord列表的入口,只有在ActivityManagerService才有TaskRecord列表的入口:
1 |
final ArrayList<TaskRecord> mRecentTasks |
ActivityStack管理ActivityRecord时,将属于同一个task的ActivityRecord放在一起,如下所示:
回退栈里可看到两个task,假设上面的task为task1,下面的task为task2,task1包含D,E两个Activity Record,task2包含3个ActivityRecord。task1位于回退栈的栈顶,task2位于task1下面,task1中E位于栈顶,task2中C位于栈顶。需注意两个task的Activity不会混在一起,也就是说task2的B不能放在task1的D和E中间。
因为回退栈是栈结构,所以此时不断按返回键,显示的Activity的顺序为E-->D-->C-->B-->A。
下一篇博客为大家讲述Activity的详细启动流程。
转载于:https://www.cnblogs.com/ldq2016/p/6889126.html
深入理解Activity启动流程(二)–Activity启动相关类的类图相关推荐
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 深入理解Activity启动流程(三)–Activity启动的详细流程2
本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--A ...
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- App 启动流程与 Activity 启动流程梳理
目录 前言 流程图 启动流程 第一阶段(Launcher 向 AMS 发送启动请求) 第二阶段(AMS 启动 Activity, 并告知 Launcher pasue) 第三阶段 (App 进程的 A ...
- androd hook acitivity 启动流程,替换启动的activity(Android Instrumentation)
前言:如果程序想要知道有activity启动,如果想要拦截activity,然后跳转到指定的activity怎么办? 我们看下ActivityThread 里面: private Activity p ...
- uboot启动流程二
我们可以看到在,start_armboot()函数的最后,在一个无限循环中调用了函数main_loop(),该函数在common/main.c文件中被定义,我们可以看到下面的一段代码: #if def ...
- Android启动流程:上电到启动第一个APP的详细流程,
1. 安卓启动大致如下图所示: 2. BootLoader (如果想了解跟详细关于bootloader请看:安卓bootloader) 从系统的角度上来讲,Android系统的启动过程可以分为 ...
- Android启动过程五个步骤,Android启动流程、app启动原理
从头分析整理学习底层知识. Android 众多基于Linux内核的系统类似, 启动系统时, bootloader启动内核和init进程. init进程分裂出更多名为"daemons(守护进 ...
- 高通8996启动流程-4. lk启动之boot_linux_from_mmc
1.前言 本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明.在lk正常启动时会进入boot_lin ...
最新文章
- 苹果服务器消息转发,iphone-与APNS服务器进行交互以将推送通知发...
- iphone 文件保存策略
- java反射 获取参数类型_Java反射带参构造创建对象时如何自动转换参数类型
- 5 随窗口改变大小_C4D默认界面两个关于坐标轴的窗口有什么区别
- dpg learning 和q_深度学习和强化学习之间的差别有多大?
- 一张小纸条(软件工程师成长过程中的一些建议)
- 多线程编程(Linux C)
- dnf服务器运行库,吃鸡需要什么运行库 | 手游网游页游攻略大全
- 华三(H3C)无线控制器AC如何登录到FIT-AP
- (SQL)使用Excel连接数据库
- 【IoT】 产品设计:结构设计之PCB板框图设计
- php对联广告代码,网站漂浮对联广告代码
- 软件测试中冒烟测试范例,浅谈冒烟测试及用例
- Introduce Parameter Object (引入参数对象)
- svc预测概率_机器学习朴素贝叶斯 SVC对新闻文本进行分类
- 洛谷P5804 [SEERC2019]Absolute Game
- 主流微服务配置中心对比 config,nacso和Apollo对比
- 普通用户sftp 无法使用解决方法
- 7-7 斐波那契(Fibonacci)数列前20项 (10 分)
- 【来日复制粘贴】让PivotTable随数据源一起动起来
热门文章
- 一、深度学习背景与人工神经网络
- 机器学习实战(二)——k-近邻算法
- python集群_使用Python集群文档
- ai与虚拟现实_将AI推向现实世界
- a.out、coff、elf三种文件格式
- postman 发送到onenet,chinanet
- python扇贝单词书_Python脚本 扇贝单词书爬取
- input change获取改变之前的值和改变之后的值_科技改变游戏:玩家使用氛围灯追踪角色资源变化...
- java changestr,java change
- c++ 异步下获取线程执行结果_这份阿里技术官强推的java线程池笔记,建议你看一下