本文基于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 tryboolean 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 statelong lastLaunchTime; // time of last launch of this activity
}
其中Activity生命周期有以下状态:
// framework/base/services/core/java/com.android.server.wm.ActivityRecord enum State {INITIALIZING, // 初始化中STARTED, // 已startedRESUMED, // 已resumedPAUSING, // pause中PAUSED, // 已pauseSTOPPING, // stop中STOPPED, // 已stopFINISHING, // finish中 正在结束???DESTROYING, // destory中DESTROYED, // 已destroyRESTARTING_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失败则回退状态为记录状态。