android里面的Activity体系结构(3)_ActivityRecord和Activity状态变化分析说明

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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值