ActivityRecord中Activity生命周期变化

本文基于AOSP13分析

ActivityRecord一些关键的属性:

final class ActivityRecord extends WindowToken implements WindowManagerService.AppFreezeListener {
    // pause 超时时间
    private static final int PAUSE_TIMEOUT = 500;
    // stop 超时时间
    private static final int STOP_TIMEOUT = 11 * 1000;
    // destroy 超时时间
    private static final int DESTROY_TIMEOUT = 10 * 1000;
    
    // Activity当前生命周期
    private State mState;    // current state we are in
    
    // realStartActivityLocked中用以记录失败次数(Exception),可以忽略
    boolean launchFailed;   // set if a launched failed, to abort on 2nd try
    
    boolean stopped;        // is activity pause finished?
    boolean delayedResume;  // not yet resumed because of stopped app switches?
    boolean finishing;      // activity in pending finish list?
    boolean hasBeenLaunched;// has this activity ever been launched?
    
    int launchCount;        // count of launches since last state
    long lastLaunchTime;    // time of last launch of this activity
}

其中Activity生命周期有以下状态:

// framework/base/services/core/java/com.android.server.wm.ActivityRecord    
    enum State {
        INITIALIZING, // 初始化中
        STARTED,      // 已started
        RESUMED,      // 已resumed
        PAUSING,      // pause中
        PAUSED,       // 已pause
        STOPPING,     // stop中
        STOPPED,      // 已stop
        FINISHING,    // finish中   正在结束???
        DESTROYING,   // destory中
        DESTROYED,    // 已destroy
        RESTARTING_PROCESS   //重启process中
    }

【状态更新时机】

INITIALIZING:

  • 类创建时赋值

STARTED:

  • makeActiveIfNeeded中,若shouldStartActivity判断为true,赋值并发送StartActivityItem给应用侧

RESUMED:

  • relaunchActivityLocked中,shouldBeResumed返回true,发送ResumeActivityItem,赋值
  • Task#minimalResumeActivityLocked中,赋值,其调用点就在ActivityTaskSupervisor#realStartActivityLocked中,andResume且readyToResume条件满足时
  • TaskFragment#resumeTopActivity中,topRunningActivity进行attachedToProcess()成功时,赋值
  • 在下面例外情况的异常里,若lastResumedActivity不为空时,给lastResumedActivity赋值

PAUSING:

  • makeActiveIfNeeded中,若shouldPauseActivity判断为true,赋值并发送PauseActivityItem给应用侧
  • TaskFragment#startPausing中,给mResumedActivity赋值

PAUSED:

  • activityPaused中,taskFragment中存在pausingActivity且不为当前activityRecord,且当前状态为PAUSING,赋值
  • relaunchActivityLocked中,shouldBeResumed返回false,发送PauseActivityItem,赋值
  • ActivityTaskSupervisor#realStartActivityLocked中,andResume且readyToResume条件不满足时,赋值
  • TaskFragment#completePause中,mPausingActivity不为空时给其赋值

STOPPING:

  • completeFinishing中当下一个activity还不可见时,需要添加当前Activity到stopping activities中,并赋值
  • stopIfPossible中,赋值并发送StopActivityItem给客户端,并启动stop timeout检查
  • TaskFragment#completePause中,满足一坨条件时赋值

STOPPED:

  • stopIfPossible中,若出现异常Exception时赋值
  • activityStopped中,当前状态为STOPPING且没有stopped时赋值

FINISHING:

  • destroyIfPossible中赋值
  • addToFinishingAndWaitForIdle中赋值

DESTROYING:

  • destroyImmediately中,如果当前正在finishing并且不能跳过destroy时(已经给应用侧发送DestroyActivityItem),赋值并发送destroy超时延迟检查消息。

DESTROYED:

  • destroyImmediately中,如果不满足上述DESTROYING逻辑时,赋值
  • destroyImmediately中,检查进程不存在并且当前不在finishing,赋值
  • removeFromHistory中,赋值
  • cleanUp中,赋值

RESTARTING_PROCESS:

  • restartProcessIfVisible中,赋值

其他情况:

TaskFragment#resumeTopActivity中,topRunningActivity进行attachedToProcess()成功时,会记录当前的状态,之后将其状态更新为RESUMED,若发送ResumeActivityItem失败则回退状态为记录状态。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值