赞
踩
在Android系统中,有两种操作会引发Activity的启动,
Launcher
会为我们启动应用程序的主 Activity
Activity
启动起来后,它又可以在内部通过调用 startActvity
接口启动新的 Activity
无论是通过点击应用程序图标来启动 Activity
,还是通过 Activity
内部调用 startActivity
接口来启动新的 Activity
,都要借助于应用程序框架层的 ActivityManagerService
服务进程。在 Android
应用程序框架层中,ActivityManagerService
是一个非常重要的接口,它不但负责启动 Activity
和 Service
,还负责管理 Activity
和 Service
。
Android
应用程序框架层中的 ActivityManagerService
启动 Activity
的过程大致如下图所示:
在这个图中,
AMS
和 ActivityStack
位于同一个进程中ApplicationThread
和 ActivityThread
位于另一个进程中。其中,AMS
是负责管理 Activity
的生命周期的,AMS
还借助 ActivityStack
是来把所有的 Activity
按照后进先出的顺序放在一个堆栈中。
对于每一个应用程序来说,都有一个 ActivityThread
来表示应用程序的主进程,而每一个 ActivityThread
都包含有一个 ApplicationThread
实例,它是一个Binder
对象,负责和其它进程进行通信。
无论是通过 Launcher
来启动 Activity
,还是通过 Activity
内部调用 startActivity
接口来启动新的Activity
,都通过 Binder
进程间通信进入到 ActivityManagerService
进程中,并且调用AMS.startActivity
接口;
AMS
调用 ActivityStack.startActivityMayWait
来做准备要启动的 Activity
的相关信息
ActivityStack
通知 ApplicationThread
要进行 Activity
启动调度了,这里的 ApplicationThread
代表的是调用AMS.startActivity
接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是 Launcher
了,而对于通过在 Activity
内部调用 startActivity
的情景来说,这个进程就是这个 Activity
所在的进程了;
ApplicationThread
不执行真正的启动操作,它通过调用 AMS.activityPaused
接口进入到 AMS
进程中,看看是否需要创建新的进程来启动 Activity
对于通过点击应用程序图标来启动 Activity
的情景来说,AMS
在这一步中,会调用startProcessLocked
来创建一个新的进程,而对于通过在 Activity
内部调用 startActivity
来启动新的Activity
来说,这一步是不需要执行的,因为新的 Activity
就在原来的 Activity
所在的进程中进行启动;
AMS
调用 ApplicationThread.scheduleLaunchActivity
接口,通知相应的进程执行启动 Activity
的操作;
ApplicationThread
把这个启动 Activity
的操作转发给 ActivityThread
,ActivityThread
通过 ClassLoader
导入相应的 Activity
类,然后把它启动起来。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。