ActivityManagerService之Activity管理的数据结构(一)

本文基于android4.4源码,是本人读源码的随笔,欢迎指正,请勿狂喷。

ActivityManagerService:
AMS用来进行组件和应用进程的管理。组件管理中的Activity管理主要通过ActivityStackSupervisor和ActivityStack来对ActivityRecord、TaskRecord进行管理。ActivityRecord代表一个最小的功能模块的记录者,也就是Activity的记录者。TaskRecord则是由一系列的最小功能模块组成,形成一个逻辑上的应用(有关android的Task的介绍有很多,就不赘述了)。AMS继承了AactivityManagerNative,间接的实现了IActivityManager业务接口以及继承了Binder的通讯机制。ActivityManagerNative还提供了ActivityManagerProxy这个Bp对象,在应用进程就可以ActivityManagerNative.getDefault()获取一个AMP的单例来使用。

通过IApplicationThread和IActivityManager这两个业务接口以及Binder通讯,实现了AMS和应用进程间之间的通讯。Android源码中的Handler经常会做一些超时操作和错误处理,很好的想法~~~在AMS、ActivityStackSupervisor、ActivityStack中的mHandler都是这样的。(比如AMS的mHandler中关于进程启动超时处理的代码片段)


final Handler mHandler = new Handler() {
        //public Handler() {
        //    if (localLOGV) Slog.v(TAG, "Handler started!");
        //}

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                 ……
		case PROC_START_TIMEOUT_MSG: {
             	   if (mDidDexOpt) {
                 	mDidDexOpt = false;
                 	Message nmsg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
                	nmsg.obj = msg.obj;
                 	mHandler.sendMessageDelayed(nmsg, PROC_START_TIMEOUT);
                  	return;
                   }
                   ProcessRecord app = (ProcessRecord)msg.obj;
                   synchronized (ActivityManagerService.this) {
                	processStartTimedOutLocked(app);
                   }
           	} break;
		……
	}


ActivityStackSupervisor:
ActivityStackSupervisor中mStacks中只包含了两个Stack就是mHomeStack和mFocusStack。mHomeStack中只保存了Launcher的Task,其他的Task则都放入mFocusStack中。通过这两个属性的注释也能看出来。


    /** The stack containing the launcher app */
    private ActivityStack mHomeStack;

    /** The non-home stack currently receiving input or launching the next activity. If home is
     * in front then mHomeStack overrides mFocusedStack.
     * DO NOT ACCESS DIRECTLY - It may be null, use getFocusedStack() */
    private ActivityStack mFocusedStack;


ActivityStackSupervisor中有当前显示的TaskId以及一些存有各个状态的ActivityRecord的数组mWaitingVisibleActivities、mStoppingActivities、mFinishingActivities、mGoingToSleepActivities等。我认为ActivityStackSupervisor的出现是方便管理Task,在2.3的版本中,ActivityRecord都是存放在一个数组中,相同Task的ActivityRecord被相邻存储,我认为这样并不方便对Task的管理,比如某个Task从后台移到前台。所以在4.4的时候加入ActivityStackSupervisor来增加对Task的管理。比如对Task的操作,AMS使用mStackSupervisor来进行。对于Acitivity的操作,AMS使用ActivityStack来进行。

ActivityStack:
管理ActivitiyRecord的一个栈。拥有管理TaskRecord的mTaskHistory、管理ActivityRecord的mLRUActivities、mNoAnimActivities。当前正在pause的Activity将其在AMS的ActivityRecord存在mPausingActivity中、上次被Pause的Activity对映的ActivityRecord存储在mLastPausedActivity里、当前显示的Activity的ActivityRecord存放在mResumedActivity里。ActivityStack的Handler中会对Activity生命周期回调操作进行超时处理。在android2.3中,所有的ActivityRecord都存放在androidStack中的mHistory数组中,并且以TaskRecord为界,相邻存放。而在android4.4中,ActivityStack中会有多个TaskRecord,每个TaskRecord中会存放该任务所拥有的ActivityRecord,这样管理起来就方便许多了。ActivityStack中对ActivityRecord的操作一般都是先从TaskRecord中查询到ActivityRecord,然后对其进行Activity生命周期的控制。

TaskRecord:

这个类中主要存储了Task所需的Activity,也存储了这个Task的Id,最后一次被调用的时间,引用这个Task的ActivityStack。定义了一系列对这个Task内的Activities操作的方法。

ActivityRecord:

ActivityRecord就是存储Activity信息的对象。这个对象中会存储我们在AndroidManifest中配置的一些内容。比如Activity实际的位置、Activity的状态、对Activity一些选项的设置等等。也会存储和当前这个ActivityRecord关联的ProcessRecord和Task的引用。

接下来就是Activity启动的流程了,和android2.3的启动方式没多大区别,只不过是引进了ActivityStackSupervisor这个类,增加一些对Task管理的操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值