AmS中的一些重要调度相关变量

要了解AmS调度、管理系统中的Activity的细节,必须了解AmS中定义的重要内部变量。要一下了解这些变量的使用时机并非易事,因此,本节仅简要说明一些变量的作用,至于具体使用的时机,要结合调度的具体过程了解。

1.系统常量

— static final int MAX_ACTIVITIES = 20;

系统只能有一个Activity处于执行状态,对于非执行状态的Activity,AmS会在内部暂时缓存起来,而不是立即杀死,但如果后台的Activity数目超过该常量,则会强制杀死一些优先级较低的Activity,所谓的“优先级高低”的规则见第10.2节。

— static final int MAX_RECENT_TASKS = 20;

AmS会记录最近启动的Activity,但只记录20个,超过该常量后,AmS会舍弃最早记录的Activity。

— static final int PAUSE_TIMEOUT = 500;

当AmS通知应用进程暂停指定的Activity时,AmS的忍耐是有限的,因为只有500毫秒,如果应用进程在该常量时间内还没有暂停,AmS会强制暂停关闭该Activity。这就是为什么在应用程序设计时,不能在onPause()中做过多事情的原因。

— static final int LAUNCH_TIMEOUT = 10*1000;

当AmS通知应用进程启动(Launch)某个Activity时,如果超过10s,AmS就会放弃。

— static final int PROC_START_TIMEOUT = 10*1000;

当AmS启动某个客户进程后,客户进程必须在10秒之内报告AmS自己已经启动,否则AmS会认为指定的客户进程不存在。

2.等待序列

由于AmS采用Service机制运作,所有的客户进程要做什么事情,都要先请求AmS,因此,AmS内部必须有一些消息序列保存这些请求,并按顺序依次进行相应的操作。

— final ArrayList mHistory = new ArrayList();

这是最最重要的内部变量,该变量保存了所有正在运行的Activity,所谓正在运行是指该HistoryRecord的finishing状态为true。比如当前和用户交互的Activity属于正在运行,从A1启动到A2,尽管A1看不见了,但是依然是正在运行,从A2按“Home”键回到桌面,A2也是正在运行,但如果从A2按“Back”键回到A1,A2就不是正在运行状态了,它会从mHistory中删除掉。

— private final ArrayList mLRUActivities = new ArrayList();

LRU代表Latest Recent Used,即最近所用的Activity列表,它不像mHistory仅保存正在运行的Activity,mLRUActivities会保存所有过去启动过的Activity。

— final ArrayList<PendingActivityLaunch>mPendingActivityLaunches
= new ArrayList<PendingActivityLaunch>();

当AmS内部还没有准备好时,如果客户进程请求启动某个Activity,那么会被暂时保存到该变量中,这也就是Pending的含义。这种情况一般发生在系统启动时,系统进程会查询系统中所有属性为Persisitant的客户进程,此时由于AmS也正在启动,因此,会暂时保存这些请求。

— final ArrayList<HistoryRecord> mStoppingActivities
= new ArrayList<HistoryRecord>();

在AmS的设计中,有这样一个理念:优先启动,其次再停止。即当用户请求启动A2时,如果A1正在运行,AmS首先会暂停A1,然后启动A2,当A2启动后再停止A1。在这个过程中,A1会被临时保存到mStoppingActivities中,知道A2启动后并处于空闲时,再回过头来停止mStoppingActivities中保存的HistoryRecord列表。

— final ArrayList mFinishingActivities = new ArrayList();

和mStoppingActivities有点类似,当AmS认为某个Activity已经处于finish状态时,不会立即杀死该Activity,而是会保存到该变量中,直到超过系统设定的警戒线后,才去回收该变量中的Activity。

3.当前不同状态的HistoryRecord

— HistoryRecord mPausingActivity = null;

正在暂停的Activity,该变量只有在暂停某个Activity时才有值,代表正在暂停的Activity。

— HistoryRecord mResumedActivity = null;

当前正在运行的Activity,这里的正在运行并不见得一定是正在与用户交互。比如当用户请求执行A2时,当前正在运行A1,此时AmS会首先暂停A1,而在暂停的过程中,AmS会通知WmS暂停获取用户消息,而此时mResumedActivity依然是A1。

— HistoryRecord mFocusedActivity = null;

这里的Focus并非是正在和用户交互,而是AmS通知WmS应该和用户交互的Activity,而在WmS真正处理这个消息之前,用户还是不能和该Activity交互。

— HistoryRecord mLastPausedActivity = null;

上一次暂停的Activity。

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

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

AmS中的一些重要调度相关变量相关推荐

  1. 传奇服务器修改变量,最新传奇服务器中相关变量设置技巧分享

    变量对于任何一个传奇私服服务器来说都是非常重要的,那些喜欢找传奇一条龙做服务器的gm或许不知道,但是那些喜欢通过自己的努力和摸索做服务器的gm应该都对变量有一定的了解.任何一个传奇私服服务器想要正常运 ...

  2. 织梦php页面中调用标签,织梦dede:php标签中调用其他普通标签和页面相关变量及全局配...

    这篇文章主要为大家详细介绍了织梦dede:php标签中调用其他普通标签和页面相关变量及全局配,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 织梦dedecms{ ...

  3. 长文综述:从大数据中寻找复杂系统的核心变量

    文章来源:[集智俱乐部] 原文链接: https://mp.weixin.qq.com/s/IIliI5plz2UBUMAzVpxClw 导语 尽管大数据的收集越来越容易,但随着从微观到宏观的尺度(s ...

  4. mysql存储过程into_MySQL存储过程中使用SELECT …INTO语句为变量赋值

    使用SELECT -INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT -INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量.SELECT -INTO语句 ...

  5. wince中的BSP工程的相关文件介绍

    一.pbcxml分析         每一个BSP都有一个工程文件,比如MyBSP.pbcxml,里面描述了BSP的信息.下面就来介绍一下BSP的pbcxml文件. 文件的大致格式应该是这样的: &l ...

  6. 关于Java中被static修饰的静态变量 (类变量)

    首先Goo某的翻译, static :(adj) 静止的,不变的. 在所有程序编译运行的过程中,变量都是由系统自动分配内存进行存储的. 在这个存储过程中,static所修饰的变量(也就是静态变量),它 ...

  7. 那些机器学习中无法衍生的强规则变量有吗?

    那些机器学习中无法衍生的强规则变量有吗? 无论是传统的LR算法,以及XGB等机器学习算法,如果是基于机器算衍生而组合出来的变量,更多地是模型和机器反哺给模型/算法工程师的结果. 一.机器学习所衍生的各 ...

  8. python打印多个变量名_如何在Python中打印单个和多个变量?

    请考虑下面Python 2.x中的两个Python代码片段.# Code 1 print 1 # Output: 1# Code 2 print(1) # Output: 1 在Python 2.X中 ...

  9. Cholesky分解对相关变量的解耦

    1. 问题引入 很多时候,我们不喜欢处理相互间不独立的变量:相比之下,我们更喜欢独立变量情况,因为对于独立变量,其联合概率密度函数就可以直接由多个边缘概率密度函数的简单乘积形式得到.对于不独立的情况, ...

  10. 【KingSCADA】如何建立硬件系统及相关变量

    小伙伴们大家好,我是雷工! 本篇学习了解KingSCADA3.8如何建立硬件系统及相关变量,以下为学习过程和操作记录. 一.前言 本篇主要讲解如何定义设备,如何定义变量. KingSCADA3.8的采 ...

最新文章

  1. 海思AI芯片(Hi3519A/3559A)方案学习(十四)JPEG图片转换成bgr文件
  2. python报错 TypeError: string indices must be integers
  3. Linux CentOS 6.5 + Apache + Mariadb + PHP环境搭建
  4. swift button一些简单设置
  5. dubbo负载均衡策略和集群容错策略
  6. Python——三级菜单
  7. cv mat的shape_将ndarray转换为cv::Mat的最简单方法是什么?
  8. Java每次输入一个字符+高精度取整计算(记洛谷P2394题WA+TLE+RE的经历,Java语言描述)
  9. SK海力士CEO前往日本 解决关键半导体原材料供应问题
  10. OpenShift 4 - 用KubeletConfig和ContainerRuntimeConfig分别修改集群节点的Kubelet和cri-o的配置
  11. C# async/await异步编程深入理解
  12. linux mint 19安装 kvm 软件包
  13. paip.gch预编译头不生效的原因以及解决:
  14. acid事务 mysql_MySQL 事务ACID特性
  15. 软件授权注册码_授权码授予
  16. linux %s替换命令,linux vi 替换命令
  17. 瀑布流插件masonry
  18. Halcon图像拼接-算法速度优化
  19. 排列奇偶性与排序的关系
  20. 武大郎后悔爱上潘金莲爱上了三剑客

热门文章

  1. 1040. 有几个PAT(25)
  2. 20155305乔磊2016-2017-2《Java程序设计》第七周学习总结
  3. javascript 对象(四)
  4. 简单分布式系统构建知识
  5. AutoMapper不用任何配置就可以从dynamic(动态)对象映射或映射到dynamic对象。
  6. jquery操作CSS样式全记录
  7. [SQL SERVER] 跨库查询--分布式查询
  8. Python学习Day06
  9. SQLi-LABS Page-4 (Challenges) Less-54-Less-65
  10. 用户模块 之 完成查询所有用户