管理Activity和组件运行状态的系统进程--ActivityManagerService

AMS的启动过程

AMS是Android提供的用于管理Activity和其他组件运行状态的系统进程,是编写apk用的最频繁的系统服务,由SystemServer中启动,同时注册到ServiceManager。它和WMS都是“实名”的Binder Server。

和WMS一样,AMS也是寄存于systemServer中的。它会在系统启动时,创建一个线程来循环处理客户的请求。值得一提的是,AMS会向ServiceManager登记多种Binder Server如“activity” “meminfo” “cpuinfo”等——不过只有第一个“activity”才是AMS的“主业”,并由Activity ManagerService实现;剩余服务的功能则是由其他类提供的。

先来看看AMS的启动过程。如下所示:

 /*frameworks/base/services/java/com/android/server/SystemServer.java*/
    public void run(){ 
        ...
        Slog.i(TAG, "Activity Manager");
        context = ActivityManagerService.main(factoryTest); //启动AMS
        ...
        ActivityManagerService.setSystemProcess(); //向ServiceManager注册AMS
    }

ActivityManagerService提供了一个静态的main函数,通过它可以轻松地启动AMS。然后还需要调用setSystemProcess来把这个重要系统服务注册到ServiceManager。由此可见它和WMS一样,都是“实名”的Binder Server:

    /*frameworks/base/services/java/com/android/server/am/ActivityManagerService.java*/
    public static final Context main(int factoryTest) {
        AThread thr = new AThread(); //创建AMS线程
        thr.start(); //启动AMS线程
        synchronized (thr) {
            while (thr.mService == null) {
                /*注意,这段代码是运行在SystemServer所在线程中的。
                所以通过mService是否为空来判断AMS成功启动与否:如果是的话就可以返回SystemServer 继续执行,否则就一直等待。
                Android在处理“系统级进程”出错时的普遍态度是“既然系统都出错 了,任何补救都是无力回天的”,所以它的异常处理部分经常是空的
                 */
                try {
                    thr.wait();
                } catch (InterruptedException e) {
                }
            }
        }
        …
        m.mMainStack=new ActivityStack(m,context,true); //创建一个ActivityStack对象,这是AMS的核心,很多工作都是围绕它展开的
        ...
        return context;
    }

对于SystemServer所在线程来说,它需要等到AThread(即上述的变量thr)成功启动后才能继续往下执行。所以当thr.start()后,就通过thr.wait()进入等待。那么,什么时候唤醒呢?答案就在AThread内部:

 public void run() {
        …
        synchronized (this) {
            mService = m;
            mLooper = Looper.myLooper();
            notifyAll();
        }
    }

上面的notifyAll会唤醒所有在thr这个object所在等待队列上的目标,自然也就包括了SystemServer所属线程。这么做的原因是SystemServer的后续运行将依赖于AMS,所以如果在AMS还未就绪的情况下就贸然返回,很可能会造成系统宕机。
将AMS注册到ServiceManager很简单,唯一要注意的是它不只注册了自己一个Server,而是一系列与进程管理相关的服务。如下所示:

    public static void setSystemProcess() {
        try {
            ActivityManagerService m = mSelf;
            ServiceManager.addService("activity", m, true);//AMS的主业ServiceManager.addService("meminfo", new
            MemBinder(m));//内存使用情况…//其他服务省略
        }
    }

核心类

ActivityStack和ActivityTask, ActivityStack是Activity的记录者和管理者,同时也为AMS管理系统运行情况提供基础,在创建AMS的线程时,会创建一个ActivityStack;ActivityTask是Android应用程序中的一大利器.

Android AMS源码阅读分析(一)

Android AMS源码分析阅读(二)

Android AMS源码分析阅读(三)

猜你喜欢

转载自blog.csdn.net/jxq1994/article/details/132631200
今日推荐