本文原创作者: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启动相关类的类图相关推荐

  1. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  2. 深入理解Activity启动流程(三)–Activity启动的详细流程2

    本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--A ...

  3. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. App 启动流程与 Activity 启动流程梳理

    目录 前言 流程图 启动流程 第一阶段(Launcher 向 AMS 发送启动请求) 第二阶段(AMS 启动 Activity, 并告知 Launcher pasue) 第三阶段 (App 进程的 A ...

  5. androd hook acitivity 启动流程,替换启动的activity(Android Instrumentation)

    前言:如果程序想要知道有activity启动,如果想要拦截activity,然后跳转到指定的activity怎么办? 我们看下ActivityThread 里面: private Activity p ...

  6. uboot启动流程二

    我们可以看到在,start_armboot()函数的最后,在一个无限循环中调用了函数main_loop(),该函数在common/main.c文件中被定义,我们可以看到下面的一段代码: #if def ...

  7. Android启动流程:上电到启动第一个APP的详细流程,

        1. 安卓启动大致如下图所示: 2. BootLoader (如果想了解跟详细关于bootloader请看:安卓bootloader) 从系统的角度上来讲,Android系统的启动过程可以分为 ...

  8. Android启动过程五个步骤,Android启动流程、app启动原理

    从头分析整理学习底层知识. Android 众多基于Linux内核的系统类似, 启动系统时, bootloader启动内核和init进程. init进程分裂出更多名为"daemons(守护进 ...

  9. 高通8996启动流程-4. lk启动之boot_linux_from_mmc

    1.前言 本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明.在lk正常启动时会进入boot_lin ...

最新文章

  1. 苹果服务器消息转发,iphone-与APNS服务器进行交互以将推送通知发...
  2. iphone 文件保存策略
  3. java反射 获取参数类型_Java反射带参构造创建对象时如何自动转换参数类型
  4. 5 随窗口改变大小_C4D默认界面两个关于坐标轴的窗口有什么区别
  5. dpg learning 和q_深度学习和强化学习之间的差别有多大?
  6. 一张小纸条(软件工程师成长过程中的一些建议)
  7. 多线程编程(Linux C)
  8. dnf服务器运行库,吃鸡需要什么运行库 | 手游网游页游攻略大全
  9. 华三(H3C)无线控制器AC如何登录到FIT-AP
  10. (SQL)使用Excel连接数据库
  11. 【IoT】 产品设计:结构设计之PCB板框图设计
  12. php对联广告代码,网站漂浮对联广告代码
  13. 软件测试中冒烟测试范例,浅谈冒烟测试及用例
  14. Introduce Parameter Object (引入参数对象)
  15. svc预测概率_机器学习朴素贝叶斯 SVC对新闻文本进行分类
  16. 洛谷P5804 [SEERC2019]Absolute Game
  17. 主流微服务配置中心对比 config,nacso和Apollo对比
  18. 普通用户sftp 无法使用解决方法
  19. 7-7 斐波那契(Fibonacci)数列前20项 (10 分)
  20. 【来日复制粘贴】让PivotTable随数据源一起动起来

热门文章

  1. 一、深度学习背景与人工神经网络
  2. 机器学习实战(二)——k-近邻算法
  3. python集群_使用Python集群文档
  4. ai与虚拟现实_将AI推向现实世界
  5. a.out、coff、elf三种文件格式
  6. postman 发送到onenet,chinanet
  7. python扇贝单词书_Python脚本 扇贝单词书爬取
  8. input change获取改变之前的值和改变之后的值_科技改变游戏:玩家使用氛围灯追踪角色资源变化...
  9. java changestr,java change
  10. c++ 异步下获取线程执行结果_这份阿里技术官强推的java线程池笔记,建议你看一下