深入理解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相关类

点击图片可看大图

IActivityManager

Activity的管理采用binder机制,管理Activity的接口是IActivityManager. ActivityManagerService实现了Activity管理功能,位于system_server进程,ActivityManagerProxy对象是ActivityManagerService在普通应用进程的一个代理对象,应用进程通过ActivityManagerProxy对象调用ActivityManagerService提供的功能。应用进程并不会直接创建ActivityManagerProxy对象,而是通过调用ActiviyManagerNative类的工具方法getDefault方法得到ActivityManagerProxy对象。所以在应用进程里通常这样启动Activty:

1
ActivityManagerNative.getDefault().startActivity() 

IApplicationThread相关类

点击图片可看大图

IApplicationThread

应用进程需要调用ActivityManagerService提供的功能,而ActivityManagerService也需要主动调用应用进程以控制应用进程并完成指定操作。这样ActivityManagerService也需要应用进程的一个Binder代理对象,而这个代理对象就是ApplicationThreadProxy对象。

ActivityManagerService通过IApplicationThread接口管理应用进程,ApplicationThread类实现了IApplicationThread接口,实现了管理应用的操作,ApplicationThread对象运行在应用进程里。ApplicationThreadProxy对象是ApplicationThread对象在ActivityManagerService线程 (ActivityManagerService线程运行在system_server进程)内的代理对象,ActivityManagerService通过ApplicationThreadProxy对象调用ApplicationThread提供的功能,比如让应用进程启动某个Activity。

ActivityManagerService相关类

点击图片可看大图

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放在一起,如下所示:

backstack

回退栈里可看到两个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lines色线halcon算子,持续更新

目录bandpass_imagelines_colorlines_facetlines_gaussbandpass_image 功能&#xff1a;使用带通滤波器提取边缘。 lines_color 功能&#xff1a;检测色线和它们的宽度。 lines_facet 功能&#xff1a;使用面模型检测线。 lines_gauss 功能&#xff1a;检测线和它们的宽…

疑问+软件

问题 1学好软件工程需要打好哪些基础&#xff1f; 2怎样学好软件工程&#xff1f; 3软件工程的发展前景如何&#xff1f; 4软件工程具体能从事哪些职业&#xff1f; 5怎样准确的找到自己的定位&#xff1f; 软件 1支付宝 优点&#xff1a;支付便捷&#xff0c;转账方便&#xf…

成功的项目管理

内容提要 第一讲 项目与项目管理 1.项目的基本概念 2.项目管理的概念 3.项目管理的重要性 第二讲 项目管理的最新发展 1.现代项目管理的创立过程 2.现代项目管理的发展趋势 3.项目管理流行的原因 第三讲 信息时代的项目管理 1.信息时代的特点 2.信息时代项目管理的特点 3.按项目…

5月23日

11.1 LAMP架构介绍一、LAMP架构介绍LAMP是LinuxApache(httpd)MySQLPHP的简写&#xff0c;即把Apache、MySQL以及PHP安装在linux系统上&#xff0c;组成一个运行环境来运行PHP脚本语言&#xff0c;通常是网站。比如Google、淘宝、百度、51cto博客、猿课论坛等就是用PHP语言写出来…

Kotlin入门简介

Kotlin的“简历” 来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)起源来自JetBrains的圣彼得堡团队&#xff0c;名称取自圣彼得堡附近的一个小岛(Kotlin Island)一种基于JVM的静态类型编程语言语法简单&#xff0c;不啰嗦 1 2…

LaTeX基础一:安装与基本操作

一、安装 1.首先下载texlive2015.iso文件。再在解压的镜像文件中运行install-tl-advanced.bat批处理命令。注意要关闭杀毒软件&#xff0c;否则可能会出现错误。2.可以修改一下安装路径&#xff0c;只要更改一个&#xff0c;其他也随之更改&#xff1a;3.把不要安装的语言包去掉…

Match图像匹配halcon算子,持续更新

目录exhaustive_matchexhaustive_match_mggen_gauss_pyramidmonotonyexhaustive_match 功能&#xff1a;模板和图像的匹配。 exhaustive_match_mg 功能&#xff1a;在一个分辨率塔式结构中匹配模板和图像。 gen_gauss_pyramid 功能&#xff1a;计算一个高斯金字塔。 mono…

c++虚函数的前奏--函数指针与回调

声明函数指针并实现回调程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数&#xff0c;不包括完全依赖于不同语法和语义规则的类成员函数&#xff08;类成员指针将在另文中讨论&#xff09;。 声明函数指针 …

你的微信,到底「连接」多少人?

作为一个技术人&#xff0c;用微信这么多年&#xff0c;也加了不少的好友和技术群。大半个月前&#xff0c;大概是5月初的时候&#xff0c;萌生了这个想法。 前后磕磕绊绊&#xff0c;经过了来美帝出差前期差点饿死、项目紧急期等艰难阶段以及各种自学、温习和设计&#xff0c;…

团队项目第一周总结

团队项目第一周总结 今天是周一&#xff0c;项目的进展周期已经进行了一周&#xff0c;做一个大概的总结吧。 周的工作先是定下团队的项目方向&#xff0c;大家技术程度各有不同&#xff0c;因此想大一统的定下一个有些稍稍的花费时间。定好《基于大数据的日志分析》这个题目后…

电路宽度测量halcon例子

一个halcon处理的例子 目录处理要求&#xff1a;原图&#xff1a;处理程序&#xff1a;处理结果&#xff1a;处理要求&#xff1a; 根据客户给的宽度&#xff0c;计算出电路宽度太窄的为NG 原图&#xff1a; 处理程序&#xff1a; read_image (Image, 1.png) rgb1_to_gray(I…

深入理解C/C++函数指针

函数指针数组的妙用 笔者在开发某软件过程中遇到这样一个问题&#xff0c;前级模块传给我二进制数据&#xff0c;输入参数为 char* buffer和 int length&#xff0c;buffer是数据的首地址&#xff0c;length表示这批数据的长度。数据的特点是&#xff1a;长度不定&#xff0c…

iOS显示性能优化过程讲解

点我跳转原文地址 卡顿的原理 iOS系统界面滑动流畅性的保持主要是依靠CPU和GPU两大处理硬件间通力合作的结果&#xff0c;一个视图的显示需要先经过CPU创建、布局计算、对图片解码、文本绘制&#xff0c;然后CPU将计算的结果交给GPU&#xff0c;GPU可能需要对图形进行变换、合成…

asp.net web api集成微信服务(使用Senparc微信SDK)

/// <summary>/// 微信请求转发控制器/// </summary>[RoutePrefix("weixin")]public class WeixinController : ApiController{#region 创建微信菜单/// <summary>/// 创建微信菜单/// </summary>/// <returns></returns>[HttpP…

1.SoapUI接口测试--创建项目

1、点击File-->New soapUI Project 2、填写项目名称&#xff0c;接口服务地址后单击【OK】按钮后就成功创建了一个项目 3、模拟发送请求 4、创建请求 或者直接Copy一个请求 5、保存项目 6、项目是以xml的格式保存的&#xff0c;下次用的时候可以直接导入&#xff0c;点击Fil…

Misc混合halcon算子,持续更新

目录convol_imageexpand_domain_graygray_insidegray_skeletonlut_transsymmetrytopographic_sketchdeviation_nconvol_image 功能&#xff1a;用一个任意滤波掩码对一个图像卷积。 expand_domain_gray 功能&#xff1a;扩大图像区域并且在扩大的区域中设置灰度值。 gray_i…

C/C++ 函数指针调用函数

01//C/C 函数指针调用函数 02#include<iostream> 03using namespace std; 04 05void site1() 06{ 07 cout<<"www.ok2002.com"<<endl; 08} 09 10void site2() 11{ 12 cout<<"www.ok1700.com"<<endl; 13} 14 15void…

汉字编码

汉字编码 一、汉字所占的字节数 对于一个字符串sizeof("请放手")&#xff0c;结果值是4。测试操作系统&#xff1a;Centos 6.4&#xff0c;硬件平台&#xff1a;Windows 7 32位 VirtualBox 4.3.12。看来用sizeof()来计算汉字所占用的字节或空间是不准确的。strlen(&…

Noise噪音halcon算子,持续更新

目录add_noise_distributionadd_noise_whitegauss_distributionnoise_distribution_meansp_distributionadd_noise_distribution 功能&#xff1a;向一个图像添加噪声。 add_noise_white 功能&#xff1a;向一个图像添加噪声。 gauss_distribution 功能&#xff1a;产生一…

sublime text3 package control 报错

安装sublime text3之后&#xff0c;安装package control 报错&#xff0c;错误信息&#xff1a;There are no packages available for installation 根据提示&#xff0c;找到错误解决办法&#xff1a;https://packagecontrol.io/doc... 其实意思就是你的电脑代理出了问题&…