文章目录
AMS是个用于管理Activity和其它组件运行状态的系统进程。
AMS
AMS在系统启动的时候,创建一个线程循环处理客户端的请求。AMS会向ServiceManager注册多种Binder Server:“activity”、“meminfo”、“cpuinfo”等。
AMS启动过程:
/*frameworks/base/services/java/com/android/server/SystemServer.java*/
public static void main(String[] args) {
...
// This used to be its own separate thread, but now it is
// just the loop we run on the main thread.
ServerThread thr = new ServerThread();
thr.initAndLoop();
}
/*frameworks/base/services/java/com/android/server/SystemServer.java*/
public void run() {
…
Slog.i(TAG, "Activity Manager");
context = ActivityManagerService.main(factoryTest); //启动AMS
…
ActivityManagerService.setSystemProcess(); //向Service Manager注册
…
}
AMS提供了一个static main函数,通过它可以轻松启动AMS,通过setSystemProcess把这个重要系统服务注册到ServiceManager。
//frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
public static final Context main(int factoryTest) {
AThread thr = new AThread();//AMS线程
thr.start();//启动
//这个线程执行在system server上,通过thr.mService判断AMS启动是否成功。如果成功,返回system server,否则一直等待。如果出错,就无力回天,空处理。
synchronized (thr) {
while (thr.mService == null) {
try {
thr.wait();
} catch (InterruptedException e) {
}
}
}
ActivityManagerService m = thr.mService;
mSelf = m;
ActivityThread at = ActivityThread.systemMain();
mSystemThread = at;
Context context = at.getSystemContext();
context.setTheme(android.R.style.Theme_Holo);
m.mContext = context;
m.mFactoryTest = factoryTest;
m.mIntentFirewall = new IntentFirewall(m.new IntentFirewallInterface());
m.mStackSupervisor = new ActivityStackSupervisor(m, context, thr.mLooper);
m.mBatteryStatsService.publish(context);
m.mUsageStatsService.publish(context);
m.mAppOpsService.publish(context);
//唤醒
synchronized (thr) {
thr.mReady = true;
thr.notifyAll();
}
m.startRunning(null, null, null, null);
return context;
}
这里一个wait & notify配对使用,让system server确保AMS启动成功,它自己再接着执行。这么做的原因无它,就是system server需要依赖于AMS。
将AMS注册到ServiceManager之后,它还注册了一系列和进程管理相关的服务:
public static void setSystemProcess() {
try {
ActivityManagerService m = mSelf;
ServiceManager.addService("activity", m, true);//AMS的主业
ServiceManager.addService("meminfo", new MemBinder(m));//内存使用情况
…//其他服务省略
}
要了解AMS提供的所有功能,可以查看IActivityManager.java文件。
可以把这些接口进行分类:
- 组件状态管理:例如startActivity、startService
- 组件状态查询:例如getServices
- Task相关:例如removeSubTask
- 其它:查询运行时信息,例如getMemoryInfo
ActivityStack
/*frameworks/base/services/java/com/android/server/am/ActivityManagerService.java*/
public static final Context main(int factoryTest) {
/*main()函数是启动AMS的入口*/
…