美文网首页
Android ActivityManagerService--

Android ActivityManagerService--

作者: DarcyZhou | 来源:发表于2023-10-30 08:58 被阅读0次

本文转载自:Android ActivityManagerService总结(三)Activity管理相关数据结构

本文基于Android 11.0源码分析

前言

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

  基本概念:

  • ActivityRecord:记录着Activity信息;

  • TaskRecord:记录着task信息;

  • ActivityStack:栈信息;

  • ActivityStackSupervisor:栈管理者。

1.ActivityRecord

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

// frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java
final class ActivityRecord extends WindowToken implements 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建立了联系。

(1)列举出重要的成员变量

AMS06.png

(2)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;

(3)Activity的状态ActivityState

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

(4)时间相关的成员变量

AMS07.png

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

2.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);
    }

(1)列出重要的成员变量信息

AMS08.png

3.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的。

(1)列出重要的成员变量信息

AMS09.png

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

4.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;
....
}

5.Activity栈关系

  Activity栈结构体的组成关系:

AMS10.png
  • 一般地,对于没有分屏功能以及虚拟屏的情况下,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。

相关文章

网友评论

      本文标题:Android ActivityManagerService--

      本文链接:https://www.haomeiwen.com/subject/jvgmvdtx.html