AMS全称:ActivityManagerService,通过activity Stack保存、管理、记录Android四大组件的状态(生命周期),提供查询服务功能的一个系统服务。它是在系统开启的时候由systemServer启动一个线程来开启的,
/*frameworks/base/services/java/com/android/server/SystemServer.java*/
public void run(){
...
Slog.i(TAG,"Activity Manager");
context = ActivityManagerService.main(factroyTest);//启动AMS
...
ActivityManagerService.setSystemProcess()//向ServiceManager注册
...
}
ActivityManagerService 提供了一个静态main函数,启动AMS,再调用setSystemProcess函数将AMS这个系统服务注册到ServiceManager,接下来我们看看AMS中main函数的实现,
/*frameworks/base/services/java/com/android/server/am/ActivityManagerService.java*/
public static final Context main(int factroyTest){
AThread thr = new AThread();//创建AMS线程
thr.start();
synchronized(thr){
white(thr.mservice == null){
thr.wait();
}
}
...
m.mMainStack = new ActivityStack(m,context,true);//创建ActivityStack对象,这个是AMS的核心
...
reture context;
}
当SystemServer调用AMS的main函数创建一个AThread线程时,首先让这个线程wait等待,只有线程的MService成功赋值后,才被唤醒,从而使SystemServer正常使用AMS,notify的操作就在线程内部
static class AThread extend Thread{
public void run(){
...
synchronized(this){
MService = m;
mLooper = Looper.myLooper();
notifyAll();
}
...
}
}
上面的notifyAll会唤醒所有在thr这个object所在等待队列上的目标,也就包括了SystemServer所属的线程。将AMS注册到ServiceManager也很方便,只是它布置注册了自己一个server,包括一系列与进程管理相关的服务,
public static void setSystemProcess(){
ActivityManagerService m = mSelf;
ServiceManager.addService(“activity”,m,true);
ServiceManager.addService(“meminfo”,newMEMBinder(m));//内存使用情况
}
想要了解AMS提供的所有功能,最好是查看IActivitymanager.java。AMS所做的工作都是围绕这份接口声明展开的,AMS大致有以下几种功能:
1、组件状态管理:
需要注意的是,这里所说的组件不仅仅是指Activity,而是Android所属的四大组件。其状态管理包括组件的开启、关闭等等一系列的操作,例如:startActivity、startActivityAndWait、activityPause的、startService、stopService、removeProvider等等
2、组件状态查询:
这类函数用于查询组件当前运行情况,如getCallingActivity、getService等。
3、Task相关 Task相关我们会在接下来详细叙说
4、其他,AMS还提供了不少辅助功能,如系统运行时信息的查询getMemoryInfo,setDebugAPP等
1、ActivityStack描述了activity所经历的所有状态,当中有一系列不同功能的ArrayList成员变量,它们都在activityRecord这个类中,
2、记录了每个Activity的运行时信息,其中有几个重要的ArrayList
ArrayList | Description |
---|---|
MHistory | 所有Activity的信息都在这里有记录,直到它被destroy |
mLRUActivities | 正在运行的Activity的列表集合,以最近的使用情况来排序,即队头元素是最近使用最少的元素 |
mStoppingActivity | 列表中的Activity已经可以被stop,但是还得等待下一个Activity处于就绪状态 |
3、除了上述ArrayList用来描述各种状态下的Activity集合外,ActivityStack还通过以下多个变量来专门记录一些特殊状态的Activity实例,
ArrayRecord | Description |
---|---|
mPausingActivity | 当前正在被暂停的(pausing)Activity |
mLastPausedActivity | 上一个被暂停的Activity |
mLastStartActivity | 最近一个被启动的Activity |
上述3类变量构成了ActivityStack的主框架,因此用一句话来概括AMS,就是通过ActivityStack来记录、管理系统中所有的Activity和其他组件的状态,并提供一系列的查询功能,这句话包含以下几点
上述基本是AMS的官方定义,究竟其如何管理组件,我们可以从startActivity一窥其貌,至于说为何选择startActivity流程,很简单AMS主要功能是管理Activity,显然跳转Activity的流程它必然都要参与。
先大致梳理一下startActivity所经历的函数调用流程,从调用方(startActivity1)开始:startActivity1->startActivity@ContextImpl->execStartActivity@Instrumentation->startActivity@ActivityManagerService,从这个调用链可以看出,经过一系列调用后最终指向的AMS的startActivity函数。
AMS中执行跳转大致有五个函数,长相差不多,首先列举出来:
一、startActivity@ActivityManagerService.java函数中就是跳转到startActivityasuser@ActivityManagerService.java
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}
可以看到startActivityAsUser就比startActivit多了一个UserId参数,它表示调用者的用户ID,
二、startActivityAsUser,这个函数主要是做权限检查,
@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
enforceNotIsolatedCaller("startActivity");
userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, false, ALLOW_FULL_ONLY, "startActivity", null);
// TODO: Switch to user app stacks here.
return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
profilerInfo, null, null, bOptions, false, userId, null, null,
"startActivityAsUser");
}
三、startActivityMayWait ,这一步的代码太多了,感兴趣的读者可以自行追踪代码去看,这里用一个流程示意:
①判断是否为显式 - > ②根据Intent查找符合条件的Activity的Activity info - > ③判断是否是重量级进程 - > ④startActivitylocked - > ⑤outResult。
四、startActivitylocked ,在ActivityStack.java中有两个这样的重载函数,参数多的我们成为startActivitylocked (1),参数少的称为startActivitylocked (2)
五、startActivityUnCheckedLocked,这个函数主要是取出目标Activity的启动模式和各种标识符,比如:是标准模式还是singleTop、singleTask、等等都是在这一步去管理