1、背景
在Android系统中,大家都知道Activity和Service是应用程序的核心组件,我们平时在开发Android应用时无时无刻都在使用它们,确实作为Android应用的四大组件,它们的地位不言而喻。虽然平时它们已被我们使用的滚瓜烂熟,但是你知道它们的启动原理吗?到这里肯定有人会问,Activity不是七个生命周期的方法吗?然后是从onCreate方法开始执行的吗?
对,你说的都没错,之所以使用起来那么简单是因为Android已经将它们封装的很完美,只暴露几个特定的方法供开发者调用,但是这仅仅是从Android的应用层角度去看它们,那我们在深入一点,从Android的框架层去了解它们呢?
好啦,话不多说,开始进入我们今天的正题。
但在开始今天的讲解之前希望大家先了解一下ActivityManagerService的一些基本知识ActivityManagerService与应用程序通信分析。
2、Activity启动方式
由于是在系统的框架层角度去剖析它们,所以篇幅也相对来说较大,所以这里我准备将Activity和Service单独阐述。首先我们来看看Activity,Activity的启动方式大家都知道吧(ps:不是我们平时所说的startActivity和startActivityForResult)?Activity一般有两种启动方式:
(1)用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity。
(2)Activity内部通过startActivity方法启动新的Activity。
鉴于这里有两种启动方式,所以我打算用三篇博客来详细的讲解它的启动方式:
(1)Activity启动流程源码分析之入门
(2)Activity启动流程源码分析之Launcher启动
(3)Activity启动流程源码分析之startActivity启动
今天我们就来先简单的谈谈Activity启动的大致流程,让大家有一个大概的了解,后面两篇文章将详细阐述。
平时大家在开发Android应用时Activity应该是用的最多的组件了吧?所以今天我们就不举示例了,直接来分析其启动流程。
3、Activity启动流程
其实无论是通过点击应用程序图标来启动Activity,还是通过Activity内部调用startActivity方法来启动新的Activity,都需要借助于应用程序框架层的ActivityManagerService服务进程,ActivityManagerService是一个非常重要的服务,它不但负责启动Activity和Service,还管理着它们。
接下来我们看下Android应用程序框架层中的ActivityManagerService启动Activity的大致流程。
我们简单的分析一下启动流程:
无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity方法来启动新的Activity,其最终都是通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity方法。
ActivityManagerService调用ActivityStackSupervisor.startActivityMayWait来做启动Activity的相关准备。
ActivityStackSupervisor会调用ApplicationThread.schedulePauseActivity方法并最终调用ActivityManagerService.activityPaused方法来Pause当前的视图,对于通过点击应用程序图标来说,这个视图就是Launcher,而对于通过在Activity内部调用startActivity来说,这个视图就是当前的Activity。
对于通过点击应用程序图标来启动的Activity,ActivityManagerService在这里会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中被启动的。
ActivityManagerServic调用ApplicationThread.scheduleLaunchActivity方法,准备启动Activity的相关操作。
ApplicationThread会调用ActivityThread.handleLaunchActivity并最终调用ActivityThread.performLaunchActivity方法通过ClassLoader导入相应的Activity类,然后把它启动起来。
好啦,到此整个Activity的启动流程我们就简单的介绍到这里,接下来我们将对它的两种启动方式进行详细的分析。