ActivityRecord是运行在system_server进程里面的,Activity是运行在应用进程里面的,虽然内部有个变量ActivityInfo info来代表Activity的所有信息,但是状态的变化不是和Activity完全一致,Activity的状态变化是由ActivityRecord状态变化来影响并改变的
1.ActivityRecord 状态
在ActivityRecord里面有个内部变化ActivityState mState,每次状态有变化的时候,都会调用setState方法来设置,其定义如下:
enum ActivityState {
INITIALIZING,
RESUMED,
PAUSING,
PAUSED,
STOPPING,
STOPPED,
FINISHING,
DESTROYING,
DESTROYED,
RESTARTING_PROCESS
}
2.Activity 状态
activity生命周期的几个方法定义:
* protected void onCreate(Bundle savedInstanceState);
*
* protected void onStart();
*
* protected void onRestart();
*
* protected void onResume();
*
* protected void onPause();
*
* protected void onStop();
*
* protected void onDestroy();
3.ActivityRecord 状态变化
主要在ActivityStack类里面,如下关键方法会设置不同状态
// setState(PAUSING)
ActivityStack.startPausingLocked()
// setState(PAUSED)
ActivityStack.completePauseLocked()
// setVisibility(true)
ActivityStack.startActivityLocked
// 首先setState(STOPPING),然后发送消息STOP_TIMEOUT_MSG,调用ActivityRecord.activityStoppedLocked来设置setState(STOPPED)
ActivityStack.stopActivityLocked
// setState(FINISHING)
ActivityStack.finishActivityLocked
// setState(DESTROYING),然后发送消息DESTROY_TIMEOUT_MSG,setState(DESTROYED)
ActivityStack.destroyActivityLocked
// setState(RESUMED)
ActivityStack.minimalResumeActivityLocked
注意,STOPPED状态是通过调用ActivityRecord的activityStoppedLocked 来设置的,没有直接在ActivityStack里面实现,:
1.STOPPED的状态:activityStoppedLocked --> setState(STOPPED)
2.INITIALIZING状态:new ActivityRecord() --> setState(INITIALIZING)
4.ActivityRecord 状态变化来改变Activity的状态
整体状态变化 Log如下,主要分为3个阶段:
第1阶段:DeskClock 应用启动前的准备工作
// 在系统进程里面,ActivityRecord(DeskClock) 状态是 INITIALIZING
08-23 17:30:21.261 1314 4528 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t-1} from:null to:INITIALIZING reason:ActivityRecord ctor
// 在系统进程里面,ActivityRecord(Launcher ) from:RESUMED to:PAUSING
08-23 17:30:21.306 1314 4528 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:RESUMED to:PAUSING reason:startPausingLocked
// 在Launcher应用进程里面,Activity(Launcher)状态是onPause
08-23 17:30:21.322 2055 2055 V Activity: onPause com.android.launcher3.Launcher@cfe111f
// 在系统进程里面,ActivityRecord(Launcher ) from:PAUSING to:PAUSED
08-23 17:30:21.324 1314 1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSING to:PAUSED reason:completePausedLocked
// 在系统进程里面,ActivityRecord(DeskClock) 状态是 from:INITIALIZING to:RESUMED
08-23 17:30:21.398 1314 1443 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87} from:INITIALIZING to:RESUMED reason:minimalResumeActivityLocked
第2阶段:DeskClock 应用进程创建并进入resume
// 在DeskClock应用进程里面,Activity(Launcher)状态是onCreate
08-23 17:30:21.706 4887 4887 V Activity: onCreate com.android.deskclock.DeskClock@5f58495: null
// 在DeskClock应用进程里面,Activity(Launcher)状态是onStart
08-23 17:30:22.009 4887 4887 V Activity: onStart com.android.deskclock.DeskClock@5f58495
// 在DeskClock应用进程里面,Activity(Launcher)状态是onResume
08-23 17:30:22.016 4887 4887 V Activity: onResume com.android.deskclock.DeskClock@5f58495
第3阶段:Launcher应用进入onStop
// 在系统进程里面,ActivityRecord(Launcher ) from:PAUSED to:STOPPING
08-23 17:30:22.955 1314 1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSED to:STOPPING reason:stopActivityLocked
// 在Launcher应用进程里面,Activity(Launcher)状态是onStop
08-23 17:30:22.957 2055 2055 V Activity: onStop com.android.launcher3.Launcher@cfe111f
// 在系统进程里面,ActivityRecord(Launcher ) from:STOPPING to:STOPPED
08-23 17:30:22.980 1314 2324 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:STOPPING to:STOPPED reason:activityStoppedLocked
4.1 第1阶段:从桌面启动DeskClock应用
此时DeskClock的应用进程还未创建,主要是Launcher应用状态的变化
a) DeskClock的ActivityRecord为INITIALIZING,Activity还未创建
b) Launcher的ActivityRecord状态RESUMED -->PAUSING --> PAUSED(运行在system_server里面)
c) Launcher的Activity状态从onResume --> onPause(运行在Launcher应用进程里面)
时序图如下:
对应的Log段是
// 步骤5:在系统进程里面,ActivityRecord(DeskClock) 状态是 INITIALIZING
08-23 17:30:21.261 1314 4528 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t-1} from:null to:INITIALIZING reason:ActivityRecord ctor
// 步骤11:在系统进程里面,ActivityRecord(Launcher ) from:RESUMED to:PAUSING
08-23 17:30:21.306 1314 4528 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:RESUMED to:PAUSING reason:startPausingLocked
// 步骤13:在Launcher应用进程里面,Activity(Launcher)状态是onPause
08-23 17:30:21.322 2055 2055 V Activity: onPause com.android.launcher3.Launcher@cfe111f
// 步骤14:在系统进程里面,ActivityRecord(Launcher ) from:PAUSING to:PAUSED
08-23 17:30:21.324 1314 1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSING to:PAUSED reason:completePausedLocked
4.2 第2阶段:DeskClock应用进入创建并启动
首先需要了解Android应用进程的创建过程,Zygote fork子进程成功返回后,会通过反射调用ActivityThread的main方法,具体如下图(从网上下载的):
在DeskClock应用进程创建后,主要是DeskClock的状态变化
DeskClock的ActivityRecord状态:从from:INITIALIZING to:RESUMED,
Activity依次:从onCreate/onStart/onResume
代码时序图如下:
其中使用到了ClientLifecycleManager来管理Activity生命周期流程
// 步骤7:在系统进程里面,ActivityRecord(DeskClock) 状态是 from:INITIALIZING to:RESUMED
08-23 17:30:21.398 1314 1443 V ActivityTaskManager: State movement: ActivityRecord{ed5f802 u0 com.android.deskclock/.DeskClock t87} from:INITIALIZING to:RESUMED reason:minimalResumeActivityLocked
// 步骤10:在DeskClock应用进程里面,Activity(Launcher)状态是onCreate
08-23 17:30:21.706 4887 4887 V Activity: onCreate com.android.deskclock.DeskClock@5f58495: null
// 步骤13:在DeskClock应用进程里面,Activity(Launcher)状态是onStart
08-23 17:30:22.009 4887 4887 V Activity: onStart com.android.deskclock.DeskClock@5f58495
// 步骤14:在DeskClock应用进程里面,Activity(Launcher)状态是onResume
08-23 17:30:22.016 4887 4887 V Activity: onResume com.android.deskclock.DeskClock@5f58495
4.2 第3阶段:Launcher应用进入onStop
在DeskClock应用进入resume后,通过binder调用ActivityTaskManagerService.activityIdle来进行Activity的回收,由于在第1阶段,Launcher已经是PAUSED状态,后面会依次将状态变更为STOPPING和STOPPED
对应的log流程是:
// 步骤5:在系统进程里面,ActivityRecord(Launcher ) from:PAUSED to:STOPPING
08-23 17:30:22.955 1314 1443 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:PAUSED to:STOPPING reason:stopActivityLocked
// 步骤6:在Launcher应用进程里面,Activity(Launcher)状态是onStop
08-23 17:30:22.957 2055 2055 V Activity: onStop com.android.launcher3.Launcher@cfe111f
// 步骤9:在系统进程里面,ActivityRecord(Launcher ) from:STOPPING to:STOPPED
08-23 17:30:22.980 1314 2324 V ActivityTaskManager: State movement: ActivityRecord{3e98fcb u0 com.android.launcher3/.Launcher t83} from:STOPPING to:STOPPED reason:activityStoppedLocked