本文基于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管理的操作。