Activity调度机制

10.1  Activity调度机制

在Android中,Activity调度的基本思路是这样的:各应用进程要启动新的Activity或者停止当前的Activity,都要首先报告给AmS,而不能“擅自处理”。AmS在内部为所有应用进程都做了记录,当AmS接到启动或停止的报告时,首先更新内部记录,然后再通知相应客户进程运行或者停止指定的Activity。由于AmS内部有所有Activity的记录,也就理所当然地能够调度这些Activity,并根据Activity和系统内存的状态自动杀死后台的Activity。

具体来讲,启动一个Activity有以下几种方式。

— 在应用程序中调用startActivity()启动指定的Activity。

— 在Home程序中单击一个应用图标,启动新的Activity。

— 按“Back”键,结束当前Activity,自动启动上一个Activity。

— 长按“Home”键,显示出当前任务列表,从中选择一个启动。

这四种启动方式的主体处理流程都会按照第一种启动方式运行,后面三种方式只是在前端消息处理上各有不同,因此,后面首先介绍第一种启动方式,然后介绍其他启动方式的前端处理差异。

10.1.1  几个重要概念

AmS中定义了几个重要的数据类,分别用来保存进程(Process)、活动(Activity)和任务(Task)。

1.进程数据类ProcessRecord

该类在framework/base/services/java/com/android/server/am/路径下,该路径最后的am代表Activity Manager,和AmS有关的重要类都在该目录下。

一个APK文件运行时会对应一个进程,当然,多个APK文件也可以运行在同一个进程中。ProcessRecord正是记录一个进程中的相关信息,该类中内部变量可分为三个部分,大家先不用琢磨具体某个变量如何被使用,而只需要先了解它们的作用。这三个部分如表10-1所示。

2.HistoryRecord数据类

AmS中使用HistoryRecord数据类来保存每个Activity的信息,有些读者可能奇怪,Activity本身也是一个类啊,为什么还要用HistoryRecord来保存Activity的信息,而不直接使用Activity呢?因为,Activity是具体的功能类,这就好比每一个读者都是一个Activity,而“学校”要为每一个读者建立一个档案,这些档案中并不包含每个读者具体的学习能力,而只是学生的籍贯信息、姓名、出生年月、家庭关系等。HistoryRecord正是AmS为每一个Activity建立的档案,该数据类中的变量主要包含两部分,如表10-2所示。

需要注意,HistoryRecord类也是一个Binder,它基于IApplicationToken.Stub类,因此,可以被IPC调用,一般是在WmS中进行该对象的IPC调用。

3.TaskRecord类

AmS中使用任务的概念确保Activity启动和退出的顺序。比如以下启动流程,A、B、C分别代表三个应用程序,数字1、2、3分别代表该应用中的Activity。

A1→A2→A3→B1→B2→C1→C2,此时应该处于C2,如果AmS中没有任务的概念,此时又要从C2启动B1,那么会存在以下两个问题:

— 虽然程序上是要启动B1,但是用户可能期望启动B2,因为B1和B2是两个关联的Activity,并且B2已经运行于B1之后。如何提供给程序员一种选择,虽然指定启动B1,但如果B2已经运行,那么就启动B2。

— 假设已经成功从C2跳转到B2,此时如果用户按“Back”键,是应该回到B1呢,还是应该回到C2?

任务概念的引入正是为了解决以上两个问题,HistoryRecord中包含一个int task变量,保存该Activity所属哪个任务,程序员可以使用Intent.FLAG_NEW_TASK标识告诉AmS为启动的Activity重新创建一个Task。

有了Task的概念后,以上情况将会是这样的:

虽然程序明确指定从C2启动到B1,程序员可以在intent的FLAG中添加NEW_TASK标识,从而使得AmS会判断B1是否已经在mHistory中。如果在,则找到B1所在的Task,并从该Task中的最上面的Activity处运行,此处也就是B2。当然,如果程序的确要启动B1,那么就不要使用NEW_TASk标识,使用的话,mHistory中会有两个B1记录,隶属于不同的Task。

TaskRecord类中的变量如表10-3所示。

需要注意的是,TaskRecord中并没有该任务中所包含的Activity列表,比如ArrayList<HistoryRecord>或者HistoryRecord[]之类的变量,这意味着不能直接通过任务id找到其所包含的Activity。要达到这个目的,可以遍历AmS中mHistory中的全部HistroyRecord,然后根据每一个HistoryRecord中的TaskRecord task变量确定是否属于指定的任务。

本文选自《Android内核剖析 》一书

图书详细信息:http://blog.csdn.net/broadview2006/article/details/6804573

Activity调度机制相关推荐

  1. cesium 渲染解析(Scene的调度机制)

    在上一篇博文中,我们模拟了绘制太阳的方法,为地球添加了赤道平面, 美中不足的是,轨道平面常会被地球给挡住.下面我们详细分析scene的调度机制. 先看一下这个结构,Cesium把绘制命令(DrawCo ...

  2. Linux内核学习笔记十一——I/O层和I/O调度机制

    一 块I/O基本概念 字符设备:按照字符流的方式被有序访问的设备.如串口.键盘等. 块设备:系统中不能随机(不需要按顺序)访问固定大小的数据片(chunk 块)的设备. 如:硬盘.软盘.CD-ROM驱 ...

  3. Activity管理(一):activity运行机制

    1.activity运行机制:返回栈 栈是一种后进先出的数据结构,启动新的活动后,该活动处于栈顶,活动销毁(按下back或者调动finish()方法)后即出栈,这时前一个活动就会重新位于栈顶. 系统总 ...

  4. 定时任务重启后执行策略_quartz定时任务框架调度机制解析

    quartz2.2.1集群调度机制调研及源码分析 引言 quartz集群架构 调度器实例化 调度过程 触发器的获取 触发trigger: Job执行过程: 总结: 附: 引言 quratz是目前最为成 ...

  5. quartz集群调度机制调研及源码分析---转载

    quartz2.2.1集群调度机制调研及源码分析 引言 quartz集群架构 调度器实例化 调度过程 触发器的获取 触发trigger: Job执行过程: 总结: 附: 引言 quratz是目前最为成 ...

  6. 一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

    [题目描述] 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量 (QoS,Qualityof Serv ...

  7. linux内核实时调度,基于Linux内核的实时调度机制的研究和实现

    摘要: 实时操作系统在当前的各个领域得到广泛应用,越来越引起人们的重视.Linux操作系统的源代码开放.内核模块化设计及内核的高度可裁减性使其在嵌入式实时操作系统研究领域备受重视.但其面向通用多任务分 ...

  8. 某大型银行深化系统技术方案之十四:服务层之服务调度机制

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 服务层 服务层主要体现了SOA体系下的组件复用和业务复用机制.服务的边界定义决定于粒度和 ...

  9. golang的goroutine调度机制

    一直对goroutine的调度机制很好奇,最近在看雨痕的golang源码分析,(基于go1.4) 感觉豁然开朗,受益匪浅: 去繁就简,再加上自己的一些理解,整理了一下 ~~ 调度器 主要基于三个基本对 ...

  10. SystemVerilog调度机制与一些现象的思考

    文章内容主要来自于以下文档,然后对自己平时遇到的一些现象作出了思考. 1.IEEE systemverilog.std.1800-2012 2.SystemVerilog Event Regions ...

最新文章

  1. 网络基础之HTTP协议
  2. python 列表转为字典的两个小方法
  3. 反弹模型(bounce model)----adot, H, Hdot变化图
  4. poj1789(prim)
  5. redis的scan命令的源码分析,实现原理
  6. 【整理】Spring 常用注解!千万不要错过!
  7. Hadoop64位版本安装后遇到的警告处理
  8. JEECG Framework 3.5.0 GA 新版本终于发布了,重量级功能(数据权限,国际化,多数据源),团队会努力推出新版本,希望大家多多支持!!
  9. Python+django网页设计入门(16):优化设计复用分页代码
  10. 余承东宣布鸿蒙系统视频,余承东宣布鸿蒙系统开源:打造全球的操作系统
  11. Python编程之输出素数
  12. 飞行堡垒FN+F5风扇调节失灵怎么办? 一文教你完美解决此问题
  13. AI一分钟 | 美媒称中国导弹阵地遭美国AI技术快速识别,人工智能主播将亮相BBC节目
  14. 大学计算机excel高级筛选,excel高级筛选的使用方法(入门 进阶 高级)
  15. 目标检测 | 盘点提升小目标检测的思路
  16. redhat下软件安装
  17. Android获取设备号SSAID (Android ID) 和 IMEI
  18. 解决Google浏览器首页被2345网站劫持
  19. 虚拟机时间不同步如何解决?
  20. 将监控摄像头的监控视频转发到互联网,实现远程视频监控

热门文章

  1. 20172330 2018-2019-1 《程序设计与数据结构》实验一报告
  2. translclude
  3. 第一阶段 高等数学——常量与变量
  4. jquery的一些常用方法
  5. Jboss项目部署出现java.lang.UnsupportedClassVersionError 问题的解决方法
  6. ELK5.3日志分析平台部署
  7. [中等]寻找缺失的数
  8. python不是内部或外部命令
  9. 图片轮播的JS写法,通用涉及多个轮播
  10. MOSS中集成各个子网站的数据到一个页面,做决策支持页面的首选: Web Capture