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



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

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

    1.系统常量

    static final int MAX_ACTIVITIES = 20;

    系统只能有一个Activity处于执行状态,对于非执行状态的ActivityAmS会在内部暂时缓存起来,而不是立即杀死,但如果后台的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时,如果超过10sAmS就会放弃。

    static final int PROC_START_TIMEOUT = 10*1000;

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

    2.等待序列

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

    final ArrayList mHistory = new ArrayList();

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

    private final ArrayList mLRUActivities = new ArrayList();

    LRU代表Latest Recent Used,即最近所用的Activity列表,它不像mHistory仅保存正在运行的ActivitymLRUActivities会保存所有过去启动过的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://www.cnblogs.com/broadview/archive/2011/09/23/2186439.html

     

  • 相关阅读:
    WebBrowser.ExecWB的完整说明
    jQuery选择器的灵活用法
    Nooice, 首次开通博客园
    【HDU】3663 Power Stations
    【HDU】4069 Squiggly Sudoku
    【FOJ】2076 SUDOKU
    【HDU】3529 Bomberman Just Search!
    【HDU】3909 Sudoku
    【HDU】2780 SuSuSudoku
    【HDU】3111 Sudoku
  • 原文地址:https://www.cnblogs.com/broadview/p/2191978.html
Copyright © 2020-2023  润新知