全部博文(465)
分类: IT业界
2011-09-26 17:01:07
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
当AmS内部还没有准备好时,如果客户进程请求启动某个Activity,那么会被暂时保存到该变量中,这也就是Pending的含义。这种情况一般发生在系统启动时,系统进程会查询系统中所有属性为Persisitant的客户进程,此时由于AmS也正在启动,因此,会暂时保存这些请求。
final ArrayList
在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.chinaunix.net/space.php?uid=13164110&do=blog&id=2897431