android内核处理机制

正在学习《android内核剖析》,总结一下,用户从点击界面上的图标,到对应的应用程序起来的过程。由于有很多细节还不太了解其用法,包括ipc的调用机制还有不明白的地方,暂时先记着先。

   点击的事件由InputReader捕获,交由InputDispatch处理。最终会到ActivityManagerService里决定启动一个activity。看类图:

android内核处理机制_第1张图片

每个应用程序所在进程,都会有自己的主线程,这个主线程就是从ActivityThread里启动起来的线程(有个main方法)。这个主线程会调用Looper的prepare方法,准备一个消息队列:MessageQueue。主线程会调用Looper的loop方法,不断地进行循环,读取消息队列,然后处理。这个loop方法是一个static方法,是通过Looper的变量:static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();来识别不同的Looper对象实例。哪个线程调用,就去到与该线程绑定的Looper对象。

 

启动过程分为2个方面来说:

1、AMS线程的工作

AMS线程的工作,在于把启动activity的消息,放进ActivityThread线程关联的消息队列里面去。具体的调用过程看下面的序列图。

在ActivityThread里可以看到很多以schedule开头的方法,这些方法,其实就是给其他线程用的,用于把消息放进ActivityThread关联的消息队列,等ActivityThread线程去处理。相应的ActivityThread里也有很多launch、perform(launch方法会调用到perform方法)开头的方法,是以schedule对应的。就像有一个特工A(某ActivityThread线程)有个邮箱(消息队列),指挥官(Ams线程)把一封指令放进该邮箱,特工A一直等在邮箱旁边,拿到指令以后,就按照指令的内容做事。指挥官(Ams线程)放完指令以后,就可以继续做其他事情了。

 

 

从序列图可以看到,是通过ActivityThread对象的mH(一个继承了Handler的内联类)放进消息队列的。

这里要注意理解handler的机制。

 

android内核处理机制_第2张图片

 

 

 

2、ActivityThread线程的工作

该线程是在loop里进行的:

 for (;;) {
            Message msg = queue.next(); // might block
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }

            // This must be in a local variable, in case a UI event sets the logger
            Printer logging = me.mLogging;
            if (logging != null) {
                logging.println(">>>>> Dispatching to " + msg.target + " " +
                        msg.callback + ": " + msg.what);
            }

            msg.target.dispatchMessage(msg);

。。。

}

可以看到,这是一个无限循环的过程。获取消息,然后处理。取到消息以后,就会回调msg.target的dispatchMessage进行处理,在准备该消息的时候,就必须要指定这个处理者。这个target必须是Handler类型。

 

 

 

 

 

下面是关于peformLaunchActivity方法的细节。

 

android内核处理机制_第3张图片

 

 

看了书、代码,发现有很多关于进程、线程的交互,还有很多不明之处。但是也理解了采用回调的一个原因:不同作用的线程可以做不同的事情,而不必等待。

你可能感兴趣的:(android内核处理机制)