Bask

Shanghai Based Android Engineer currently develop Payment systems at Ctrip

👨‍🔧‍

Android Apk的运行过程(一)—— Activity启动与页面事件传递

By Bask on May 16, 2019

最近在看一本书--《Android 内核剖析》。看名字很唬人,内核剖析,看起来是讲很深入的东西,其实作者自己在前言里也说了对于Android内核深度的一些见解。此书其实只是一些抛砖引玉,对于更深度与更细节的东西并没有涉猎,但是对于开发过程中的查询各种类型的错误与理解Android App中的各种原理解释的还是非常好的。

下面我就截取第六章的部分段落,“摘抄”在此处。目的是为了让我以后看吧。

下面这段是作者讲解Apk 在系统中如何启动的:

当ActivityThread接收到AmS发送start某个Activity后,就会创建指定的Activity对象。Activity又会创建PhoneWindow类(其实并不是Activity创建的,应该说是WindowManager创建的)-> DecorView类 -> 创建相应的View或者ViewGroup。创建完成后,Activity需要把创建好的界面显示到屏幕上,于是调用WindowManger类,后者创建一个ViewRoot对象,该对象实际上创建了ViewRoot类和W类,创建ViewRoot对象后,WindowManger再调用WmS提供的远程接口完成添加一个窗口并显示到屏幕上。

接着他又讲了用户在手机屏幕上操作,点击时,这些事件是如何传递到各个页面的:

接下来,用户开始在程序界面上操作。KeyQ线程不断把用户消息存储到QueueEvent队列中,InputDispatcherThread线程逐个取出消息,然后调用WmS中的相应函数处理该消息。当WmS发现该消息属于客户端某个窗口时,就会调用相应窗口的W接口。

这两段写的非常好,从Android页面的创建到用户事件的消耗分析的淋漓精致。

美中不足,比如他没有讲到创建ActivityThread,也没有讲到启动时虚拟机的创建。

Todo: 将流程启动画一个流程图,然后更详细一些