AMS原理

android里面的Activity体系结构

(1)ActivityDisplay/ActivityStack/TaskRecord/ActivityRecord

1.整体关系图如下在这里插入图片描述

在这里插入图片描述 

2.类定义相关介绍

整体类图如下:

在这里插入图片描述

2.1 ActivityDisplay

ActivityDisplay表示一个屏幕,Android支持三种屏幕:主屏幕,外接屏幕(HDMI等),虚拟屏幕(投屏)。一般情况下,即只有主屏幕时,ActivityStackSupervisor与ActivityDisplay都是系统唯一;
  ActivityDisplay是ActivityStackSupervisor的内部类,它相当于一个工具类,封装了移除和添加ActivityStack的方法。

ActivityDisplay 类有如下关键变量

    DisplayContent mDisplayContent;  // 对应WindowManagerService的显示
    /** Actual Display this object tracks. */
    int mDisplayId;  // id

    /**
     * All of the stacks on this display. Order matters, topmost stack is in front of all other
     * stacks, bottommost behind. Accessed directly by ActivityManager package classes. Any calls
     * changing the list should also call {@link #onStackOrderChanged()}.
     */
     // 当前显示屏上的所有ActivityStack
    private final ArrayList<ActivityStack> mStacks = new ArrayList<>();

2.2 ActivityStack

ActivityStack类有如下关键变量

    final int mStackId;  // 唯一ID
    /** The attached Display's unique identifier, or -1 if detached */
    int mDisplayId;  // 所处的显示屏id,如果detach则为-1
    /**
     * The back history of all previous (and possibly still
     * running) activities.  It contains #TaskRecord objects.
     */
    // ActivityStack里面所包含的所有TaskRecord对象
    private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();

    TaskStack mTaskStack;  // 对应WindowManagerService里面的

      /**
     * Current activity that is resumed, or null if there is none.
     */
    ActivityRecord mResumedActivity = null; // 当前resume状态的Activity

 2.3 TaskRecord

TaskRecord表示任务栈,用于记录activity开启的先后顺序。其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。有了TaskRecord,Android系统才能知道当一个Activity退出时,接下来该显示哪一个Activity。

TaskRecord 类有如下关键变量

    final int taskId;       // Unique identifier for this task.

     /** List of all activities in the task arranged in history order */
    final ArrayList<ActivityRecord> mActivities; // 当前Task里面所包含的所有Activity对象

    /** Current stack. Setter must always be used to update the value. */
    private ActivityStack mStack;  // 所属的ActivityStack

    Task mTask; // 对应WindowManagerService里面的

2.4 ActivityRecord

ActivityRecord是Activity在system_server进程中的镜像,Activity实例与ActivityRecord实例一一对应。ActivityRecord用来存储Activity的信息,如所在的进程名称,应用的包名,所在的任务栈的taskAffinity等。

ActivityRecord 类有如下关键变量

   
    final IApplicationToken.Stub appToken; // window manager token
    // TODO: Remove after unification
    AppWindowToken mAppWindowToken; // 继承自WindowToken,代表一种window类型,为应用窗口
    // activity相关的信息
    final ActivityInfo info; // all about me
    
    private TaskRecord task;        // the task this is in.
    // ActivityRecord在初始化的时候会创建Token对象,作为服务端
   static class Token extends IApplicationToken.Stub

(2)ActivityStackSupervisor

  ActivityStackSupervisor是ActivityStack的管理者,内部管理了mHomeStack、mFocusedStack和mLastFocusedStack三个ActivityStack。其中,mHomeStack管理的是Launcher相关的Activity栈, stackId为0;mFocusedStack管理的是当前显示在前台Activity的Activity栈;mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。

public final class ActivityStackSupervisor implements DisplayListener {

	/** The stack containing the launcher app. Assumed to always be attached to
     * Display.DEFAULT_DISPLAY. */
    private ActivityStack mHomeStack;

    /** The stack currently receiving input or launching the next activity. */
    private ActivityStack mFocusedStack;

    /** If this is the same as mFocusedStack then the activity on the top of the focused stack has
     * been resumed. If stacks are changing position this will hold the old stack until the new
     * stack becomes resumed after which it will be set to mFocusedStack. */
    private ActivityStack mLastFocusedStack;

	/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
    private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<>();

	ActivityStack createStackOnDisplay(int stackId, int displayId) {
        ……
        ActivityContainer activityContainer = new ActivityContainer(stackId);
        mActivityContainers.put(stackId, activityContainer);
        activityContainer.attachToDisplayLocked(activityDisplay);
        return activityContainer.mStack;
    }

	class ActivityContainer extends android.app.IActivityContainer.Stub {
			final ActivityStack mStack;
			ActivityDisplay mActivityDisplay;

			ActivityContainer(int stackId) {
            	synchronized (mService) {
                	mStackId = stackId;
                	mStack = new ActivityStack(this, mRecentTasks);
           		 }
        	}

			void attachToDisplayLocked(ActivityDisplay activityDisplay) {
            		……
					mActivityDisplay = activityDisplay;
            		activityDisplay.attachActivities(mStack);
       		 }

			protected void detachLocked() {
          		 ……
           		 if (mActivityDisplay != null) {
                	mActivityDisplay.detachActivitiesLocked(mStack);
           		 }
        	}
	}
}

  ActivityDisplay的添加和移除ActivityStack的方法又被封装进了ActivityContainer类中,ActivityStackSupervisor调用ActivityContainer的attachToDisplayLocked与detachLocked对ActivityStack列表进行重排序,将任务栈从后台切换至前台。

(3)前台任务栈与后台任务栈

在这里插入图片描述

后台任务栈里面的Activity全部处于onStop状态。

(4)成员变量

activity_record

  • ActivityRecord: 记录着Activity信息
  • TaskRecord: 记录着task信息
  • ActivityStack: 栈信息

4.1 ActivityRecord

Activity的信息记录在ActivityRecord对象, 并通过通过成员变量task指向TaskRecord

  • ProcessRecord app //跑在哪个进程
  • TaskRecord task //跑在哪个task
  • ActivityInfo info // Activity信息
  • int mActivityType //Activity类型
  • ActivityState state //Activity状态
  • ApplicationInfo appInfo //跑在哪个app
  • ComponentName realActivity //组件名
  • String packageName //包名
  • String processName //进程名
  • int launchMode //启动模式
  • int userId // 该Activity运行在哪个用户id

再来说一说Activity类型和Activity状态的常量:

mActivityType:

  • APPLICATION_ACTIVITY_TYPE:普通应用类型
  • HOME_ACTIVITY_TYPE:桌面类型
  • RECENTS_ACTIVITY_TYPE:最近任务类型

ActivityState:

  • INITIALIZING
  • RESUMED:已恢复
  • PAUSING
  • PAUSED:已暂停
  • STOPPING
  • STOPPED:已停止
  • FINISHING
  • DESTROYING
  • DESTROYED:已销毁

最后,说一说时间相关的成员变量:

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

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

4.2 TaskRecord

Task的信息记录在TaskRecord对象.

  • ActivityStack stack; //当前所属的stack
  • ArrayList mActivities; // 当前task的所有Activity列表
  • int taskId
  • String affinity; 是指root activity的affinity,即该Task中第一个Activity;
  • int mCallingUid;
  • String mCallingPackage; //调用者的包名

4.3 ActivityStack

  • ArrayList mTaskHistory //保存所有的Task列表
  • ArrayList mStacks; //所有stack列表
  • final int mStackId;
  • int mDisplayId;
  • ActivityRecord mPausingActivity //正在pause
  • ActivityRecord mLastPausedActivity
  • ActivityRecord mResumedActivity //已经resumed
  • ActivityRecord mLastStartedActivity

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

4.4 ActivityStackSupervisor

  • ActivityStack mHomeStack //桌面的stack
  • ActivityStack mFocusedStack //当前聚焦stack
  • ActivityStack mLastFocusedStack //正在切换
  • SparseArray mActivityDisplays //displayId为key
  • SparseArray mActivityContainers // mStackId为key

home的栈ID等于0,即HOME_STACK_ID = 0;

(5) Activity栈关系

ams_relations

  • 一般地,对于没有分屏功能以及虚拟屏的情况下,ActivityStackSupervisor与ActivityDisplay都是系统唯一;
  • ActivityDisplay主要有Home Stack和App Stack这两个栈;
  • 每个ActivityStack中可以有若干个TaskRecord对象;
  • 每个TaskRecord包含如果若干个ActivityRecord对象;
  • 每个ActivityRecord记录一个Activity信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值