Android ActivityManagerService总结(三)Activity管理相关数据结构

一. 前言

        接上一篇文章 AMS组成 , 介绍了一下AMS的内部数据结构,  ProcessRecord容器,还有四大组件记录表 ,  本篇文章继续讲解一下与Activity管理相关的数据结构,  重点关注如下4个类文件:ActivityRecord   TaskRecord    ActivityStack  ActivityStackSupervisor

基本概念:

  • ActivityRecord: 记录着Activity信息
  • TaskRecord: 记录着task信息
  • ActivityStack: 栈信息
  • ActivityStackSupervisor : 栈管理者

二. ActivityRecord

        ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity.翻译:历史栈中的一个条目,代表一个activity.

final class ActivityRecord extends ConfigurationContainer {
....
    final ActivityTaskManagerService mAtmService; // owner
    final IApplicationToken.Stub appToken; // window manager token
    
     final ActivityInfo info; // all about me
    // TODO: This is duplicated state already contained in info.applicationInfo - remove
    ApplicationInfo appInfo; // information about activity's app

    //ActivityRecord所在的TaskRecord
    TaskRecord task;        // the task this is in.

    //ActivityRecord的构造方法, 需要传递大量的信息
    ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller,
            int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage, Intent _intent,
            String _resolvedType, ActivityInfo aInfo, Configuration _configuration,
            ActivityRecord _resultTo, String _resultWho, int _reqCode, boolean _componentSpecified,
            boolean _rootVoiceInteraction, ActivityStackSupervisor supervisor,
            ActivityOptions options, ActivityRecord sourceRecord) {
        mAtmService = _service;
        mRootActivityContainer = _service.mRootActivityContainer;
        appToken = new Token(this, _intent);
        info = aInfo;
        launchedFromPid = _launchedFromPid;
        launchedFromUid = _launchedFromUid;
        launchedFromPackage = _launchedFromPackage;
        mUserId = UserHandle.getUserId(aInfo.applicationInfo.uid);
        intent = _intent;
        shortComponentName = _intent.getComponent().flattenToShortString();
        resolvedType = _resolvedType;
        componentSpecified = _componentSpecified;
        rootVoiceInteraction = _rootVoiceInteraction;
        mLastReportedConfiguration = new MergedConfiguration(_configuration);
        resultTo = _resultTo;
        resultWho = _resultWho;
        requestCode = _reqCode;
        //省略剩下的参数

....
}

ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。
ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecord与TaskRecord建立了联系.

列举出重要的成员变量

序号成员变量描述
1ProcessRecord app运行在哪个进程
2TaskRecord task运行在哪个task
3ActivityInfo infoActivity的信息
4int mActivityTypeActivity类型
5ActivityState stateActivity的状态
6ApplicationInfo appInfo运行在哪个app中
7ComponentName realActivity组件名
8String packageName包名
9String processName进程名
10int launchMode启动模式
11int userId 该Activity运行在哪个用户id

Activity类型

    /** Activity type is currently not defined.  未定义类型*/
    public static final int ACTIVITY_TYPE_UNDEFINED = 0;

    /**标准Activity类型 Standard activity type. Nothing special about the activity... */
    public static final int ACTIVITY_TYPE_STANDARD = 1;

    /** 桌面类型 Home/Launcher activity type. */
    public static final int ACTIVITY_TYPE_HOME = 2;

    /** 最近任务类型  Recents/Overview activity type. There is only one activity with this type in the system. */
    public static final int ACTIVITY_TYPE_RECENTS = 3;

    /** 辅助Activity类型Assistant activity type. */
    public static final int ACTIVITY_TYPE_ASSISTANT = 4;

Activity的状态ActivityState 

enum ActivityState {
        INITIALIZING,
        RESUMED,     //已恢复
        PAUSING,
        PAUSED,      //已暂停
        STOPPING, 
        STOPPED,     //已停止
        FINISHING,
        DESTROYING,
        DESTROYED,   //已销毁
        RESTARTING_PROCESS
    }

时间相关的成员变量:

时间点赋值时间含义
createTimenew ActivityRecordActivity首次创建时间点
displayStartTimeAS.setLaunchTimeActivity首次启动时间点
fullyDrawnStartTimeAS.setLaunchTimeActivity首次启动时间点
startTimeActivity上次启动的时间点
lastVisibleTimeAR.windowsVisibleLockedActivity上次成为可见的时间点
cpuTimeAtResumeAS.completeResumeLocked从Rsume以来的cpu使用时长
pauseTimeAS.startPausingLockedActivity上次暂停的时间点
launchTickTimeAR.startLaunchTickingLockedEng版本才赋值
lastLaunchTimeASS.realStartActivityLocked上一次启动时间

其中AR是指ActivityRecord, AS是指ActivityStack。

三. TaskRecord

         Task的信息记录在TaskRecord对象.

         TaskRecord,内部维护一个 ArrayList<ActivityRecord> 用来保存ActivityRecord。
frameworks/base/services/core/java/com/android/server/am/TaskRecord.java

 final int taskId;       // Unique identifier for this task. 任务ID
 /** List of all activities in the task arranged in history order */
 //使用一个ArrayList来保存所有的ActivityRecord
 final ArrayList<ActivityRecord> mActivities;
 //TaskRecord所在的ActivityStack
 private ActivityStack mStack; 



//构造方法
TaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info, Intent _intent,
            IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) {
        mService = service;
        userId = UserHandle.getUserId(info.applicationInfo.uid);
        taskId = _taskId;
        lastActiveTime = SystemClock.elapsedRealtime();
        mAffiliatedTaskId = _taskId;
        voiceSession = _voiceSession;
        voiceInteractor = _voiceInteractor;
        isAvailable = true;
        mActivities = new ArrayList<>();
        mCallingUid = info.applicationInfo.uid;
        mCallingPackage = info.packageName;
        setIntent(_intent, info);
        setMinDimensions(info);
        touchActiveTime();
        mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity);
    }

列出重要的成员变量信息

序号成员变量描述
1ActivityStack stack当前所属的stack
2ArrayList mActivities当前task的所有Activity列表
3int taskIdtaskID
4String affinity是指root activity的affinity,即该Task中第一个Activity;
5int mCallingUid调用者的UID
6String mCallingPackage调用者的包名

四. ActivityStack

ActivityStack,内部维护了一个 ArrayList<TaskRecord> ,用来管理TaskRecord
 

class ActivityStack extends ConfigurationContainer {
.....
   /**
     * The back history of all previous (and possibly still
     * running) activities.  It contains #TaskRecord objects.
     */
    // 使用一个ArrayList来保存TaskRecord
    private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
    //持有一个 ActivityStackSupervisor,所有的运行中的ActivityStacks都通过它来进行管
    protected final ActivityStackSupervisor mStackSupervisor;

    
    //构造方法
    TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            boolean toTop, ActivityRecord activity, ActivityRecord source,
            ActivityOptions options) {
        //创建一个task
        final TaskRecord task = TaskRecord.create(
                mService, taskId, info, intent, voiceSession, voiceInteractor);
        // add the task to stack first, mTaskPositioner might need the stack association
        //将task添加到ActivityStack中去
        addTask(task, toTop, "createTaskRecord");
        final int displayId = mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY;
        final boolean isLockscreenShown = mService.mStackSupervisor.getKeyguardController()
                .isKeyguardOrAodShowing(displayId);
        if (!mStackSupervisor.getLaunchParamsController()
                .layoutTask(task, info.windowLayout, activity, source, options)
                && !matchParentBounds() && task.isResizeable() && !isLockscreenShown) {
            task.updateOverrideConfiguration(getRequestedOverrideBounds());
        }
        task.createTask(toTop, (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0);
        return task;
    }

    //添加Task到指定位置
    void addTask(final TaskRecord task, int position, boolean schedulePictureInPictureModeChange,
            String reason) {
        // TODO: Is this remove really needed? Need to look into the call path for the other addTask
        //若存在,先移除
        mTaskHistory.remove(task);
        if (isSingleTaskInstance() && !mTaskHistory.isEmpty()) {
            throw new IllegalStateException("Can only have one child on stack=" + this);
        }

        position = getAdjustedPositionForTask(task, position, null /* starting */);
        final boolean toTop = position >= mTaskHistory.size();
        final ActivityStack prevStack = preAddTask(task, reason, toTop);
        //添加task到mTaskHistory
        mTaskHistory.add(position, task);
        //为TaskRecord设置ActivityStack
        task.setStack(this);

        updateTaskMovement(task, toTop);

        postAddTask(task, prevStack, schedulePictureInPictureModeChange);
    }
....
}

可以看到ActivityStack使用了一个ArrayList来保存TaskRecord。
另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。
ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理
ActivityStack的.

列出重要的成员变量信息

序号成员变量描述
1ArrayList mTaskHistory保存所有的Task列表
2ArrayList mStacks所有stack列表
3int mStackId栈ID
4int mDisplayIdaffinity附加的显示器的唯一标识符,如果已分离,则为-1
5ActivityRecord mPausingActivity正在pause状态的ActivityRecord
6ActivityRecord mLastPausedActivity最后pause状态ActivityRecord
7ActivityRecord mResumedActivity已经resumed Activity的ActivityRecord对象

所有前台stack的mResumedActivity的state == RESUMED, 则表示allResumedActivitiesComplete, 此时mLastFocusedStack = mFocusedStack;

五. ActivityStackSupervisor

ActivityStackSupervisor,顾名思义,就是用来管理ActivityStack的
frameworks/base/services/core/java/com/android/server/wm/ActivityDisplay.java

class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        implements WindowContainerListener {
....
    //管理的是Launcher相关的任务
    private ActivityStack mHomeStack = null; 
    //管理的是Recent相关的任务栈
    private ActivityStack mRecentsStack = null;
    //画中画的任务栈
    private ActivityStack mPinnedStack = null;
    //分屏模式下的主屏幕栈
    private ActivityStack mSplitScreenPrimaryStack = null;
....
}

六. Activity栈关系

Activity栈结构体的组成关系:  点击查看大图

  • 一般地,对于没有分屏功能以及虚拟屏的情况下,ActivityStackSupervisor与ActivityDisplay都是系统唯一;
  • ActivityDisplay主要有Home Stack和App Stack这两个栈;
  • 每个ActivityStack中可以有若干个TaskRecord对象;
  • 每个TaskRecord包含如果个ActivityRecord对象;
  • 每个ActivityRecord记录一个Activity信息。

(1)正向关系链表:

  1. ActivityStackSupervisor.mActivityDisplays

  2. -> ActivityDisplay.mStacks

  3. -> ActivityStack.mTaskHistory

  4. -> TaskRecord.mActivities

  5. -> ActivityRecord

(2)反向关系链表:

  1. ActivityRecord.task

  2. -> TaskRecord.stack

  3. -> ActivityStack.mStackSupervisor

  4. -> ActivityStackSupervisor

注:ActivityStack.mDisplayId可找到所对应的ActivityDisplay;

七. 参考文章

 四大组件之ActivityRecord

AMS:ActivityRecord 理解 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值