上一篇《Android Framework的启动过程》分析了安卓系统从启动到进入桌面(Home)的这么一个过程,接下来说说,点击桌面上的某一个图标,进入某个App到打开Activity,也就是startActivity()的这么一个过程。
之前自己整理了startActivity()的这么一个过程,后来网上看到一篇博文,觉得人家写的更加清楚,图文并茂,更有助于理解,所以就想在这里分享了http://www.tuicool.com/articles/jmyUFbM
摘要:
startActivity
的整体流程与startService流程非常相近,但比服务启动更为复杂,多了UI的相关内容以及Activity的生命周期更为丰富。
对于Activity的启动过程,可用如下图来概括。
启动流程:
到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
启动Activity较为复杂,涉及UI渲染问题,后续再单独篇幅从源码角度阐述该过程。
Activity的生命周期中只有在以下3种状态之一,才能较长时间内保持状态不变。
除此之外,其他状态都是过渡状态(或称为暂时状态),比如onCreate(),onStart()后很快就会调用onResume()方法
对于App来说,其Activity的生命周期执行是由系统进程中的·ActivityManagerService·服务触发的,接下来从进程和线程的角度来分析Activity的生命周期,这里涉及到系统进程和应用进程:
system_server进程是系统进程,java framework框架的核心载体,里面运行了大量的系统服务,比如这里提供ApplicationThreadProxy(简称ATP),ActivityManagerService(简称AMS),这个两个服务都运行在system_server进程的不同线程中,由于ATP和AMS都是基于IBinder接口,都是binder线程,binder线程的创建与销毁都是由binder驱动来决定的。
App进程是应用程序所在进程,主线程主要负责Activity/Service等组件的生命周期以及UI相关操作都运行在这个线程; 另外,每个App进程中至少会有两个binder线程 ApplicationThread(简称AT)和ActivityManagerProxy(简称AMP),除了下图中所示的线程,其实还有很多线程,比如signal catcher线程等。
Binder
用于不同进程之间通信,由一个进程的Binder客户端向另一个进程的服务端发送事件,比如图中线程2向线程4发送事务;而 handler
用于同一个进程中不同线程的通信,比如图中线程4向主线程发送消息。
结合图说说Activity生命周期,比如暂停Activity的流程如下:
线程1
的AMS中调用 线程2
的ATP来发送事件;(由于同一个进程的线程间资源共享,可以相互直接调用,但需要注意多线程并发问题)线程2
通过binder将暂停Activity的事件传输到App进程的 线程4
;线程4
通过handler消息机制,将暂停Activity的消息发送给 主线程
;主线程
在looper.loop()中循环遍历消息,当收到暂停Activity的消息(PAUSE_ACTIVITY
)时,便将消息分发给ActivityThread.H.handleMessage()方法,再经过方法的层层调用,最后便会调用到Activity.onPause()方法。这便是由AMS完成了onPause()控制,那么同理Activity的其他生命周期也是这么个流程来进行控制的。
从上面可以很清楚的把startActivity()的过程梳理下来,最后调用到Activity里的onCreate(),onCreate()里一开始就是setContentView(),即设置View,这其实就是到了应用窗口的创建于显示过程了,可以参见我的另一篇博文《应用窗口的从创建到显示的过程》。