Activity栈管理相关类

Activity栈管理 有助于理解Activity启动流程

Activity在AMS 中存在的形式为ActivityRecord;

AMS以Task的方式管理Activity,Task在AMS存在的形式为TaskRecord

TaskRecord在AMS中依靠ActivityStack去管理

ActivityStack同样有管理者,ActivityStackSupervisor负责管理ActivityStack

主要涉及四个类

  • ActivityRecord

  • 存在历史栈的一个实例,代表一个Activity。

  • TaskRecord

  • 真正的Activity栈,内部维护一个ArrayList

  • ActivityStack 栈的结构类

  • 并不是一个Activity栈,严格意义上来说TaskRecord才是Activity栈,这个类负责管理各个TaskRecord,内部维护了一个ArrayList
    +

  • ActivityStackSupervisor

  • 内部持有一个ActivityStack,而ActivityStack内部也持有ActivityStackSupervisor,相当于ActivityStack的辅助管理类

ActivityRecord

ActivityRecord是Activity在AMS中的存在形式,ActivityRecord保存了Activity的信息。

final class ActivityRecord {
    TaskRecord task;  // 自己所在的TaskRecord,这样查找就不需要通过遍历所有的TaskRecord
    int theme;//主题
    int launchMode;//启动模式
    ...
}

TaskRecord

AMS以Task的方式在管理Activity,Android把用户一次操作相关的Activity按照先后顺序保存在一个Task中,这个Task在AMS中的存在形式就是TaskRecord;

TaskRecord中的mActivities是一个栈,它的作用是以栈的方式组织管理Activity。

final class TaskRecord {
  ...........
  final int taskId;       // Unique identifier for this task.
  int mAffiliatedTaskId; // taskId of parent affiliation or self if no parent.
  // 是指root activity的affinity,即该Task中第一个Activity; 可以理解为当前task的name;
  String affinity;        // The affinity name for this task, or null; may change identity.
  // 启动这个task的intent
  Intent intent;          // The original intent that started the task.
  // task模式
  int mLockTaskMode;      // Which tasklock mode to launch this task in. One of
                           // ActivityManager.LOCK_TASK_LAUNCH_MODE_*
  // 该Task中所有的Activity
  final ArrayList<ActivityRecord> mActivities;
  // 管理该Task的ActivityStack,
  ActivityStack stack;

  // 最近列表中,可以看到当前Task的缩略图
  private Bitmap mLastThumbnail; // Last thumbnail captured for this item.
  private final File mLastThumbnailFile; // File containing last thumbnail.

  final ActivityManagerService mService;
  ..........
}

ActivityStack

TaskRecord的管理类

final class ActivityStack {
   private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>(); //ActivityStack中所有的TaskRecord
    private final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<>();//最近活动过的ActivityRecord
    ......  
    final int mStackId;  //ActivityStack的唯一标识
    final ActivityContainer mActivityContainer;
    /** The other stacks, in order, on the attached display. Updated at attach/detach time. */
    ArrayList<ActivityStack> mStacks; //绑定的ActivityDisplay中的所有ActivityStack
    /** The attached Display's unique identifier, or -1 if detached */
    int mDisplayId;//绑定的ActivityDisplay的id,默认为Display.DEFAULT_DISPLAY = 0;
    ......  
    //ActivityStack的管理者ActivityStackSupervisor,通过其运行所有的ActivityStacks  
    final ActivityStackSupervisor mStackSupervisor;
    ActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer, RecentTasks recentTasks) {
        mStackSupervisor = activityContainer.getOuter();
        ...
    }
}

ActivityStackSupervisor

ActivityStackSupervisor 用于管理ActivityStack;ActivityStackSupervisor为AMS提供管理方法;管理着系统中的三个ActivityStack;

public final class ActivityStackSupervisor {
    //mHomeStack管理的是Launcher相关的Activity栈
    private ActivityStack mHomeStack;
	//mFocusedStack管理的是当前显示在前台Activity的Activity栈;
    private ActivityStack mFocusedStack;

    /** 保存上一次显示在前台的Activity栈 */
    private ActivityStack mLastFocusedStack;
        /** List of activities that are waiting for a new activity to become visible before completing
     * whatever operation they are supposed to do. */
    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();

    /** List of processes waiting to find out about the next visible activity. */
    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
            new ArrayList<IActivityManager.WaitResult>();

    /** List of processes waiting to find out about the next launched activity. */
    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
            new ArrayList<IActivityManager.WaitResult>();

    /** List of activities that are ready to be stopped, but waiting for the next activity to
     * settle down before doing so. */
    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();

    /** List of activities that are ready to be finished, but waiting for the previous activity to
     * settle down before doing so.  It contains ActivityRecord objects. */
    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();

    /** List of activities that are in the process of going to sleep. */
    final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
    ......    
    /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
    private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();//以mStackId为key

    /** Mapping from displayId to display current state */
    private final SparseArray<ActivityDisplay> mActivityDisplays =
            new SparseArray<ActivityDisplay>();//以displayId为key
}

ActivityDisplay

是ActivityContainer内部类

可以理解成为一个屏幕,保存着该屏幕的ActivityStack的数组mStacks,并对其进行管理操作。同时也保存了该屏幕下单特殊ActivityStatck,如mHomeStack、mRecentsStack、mPinnedStack、mSplitScreenPrimaryStack。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值