本文共 1863 字,大约阅读时间需要 6 分钟。
不同于其他系统,在Android中Application并不是一个重要的概念,甚至开发人员在开发的过程中很少需要直接与Application打交道,其提供的也仅仅是一个上下文环境。至于为什么会这样,还是与设计者的设计思想有关。Android的设计者希望呈现给用户的是一个组件化的操作系统,开发者只需要与Activity
,Service
,BroadcatReceiver
,ContentProvider
进行交互就行了,并且上述这些组件才是Android的核心概念。
当第一个Activity
被创建时,系统会为通过makeApplication
方法创建一个Application实例,同时也会创建一个进程。默认情况下这个进程的名字和包名相同。当然开发者也可以通过android:process=name
的方式设定进程名。之后再创建其他组件时,也会被放入到这个进程中。
尽管Application名字听起来很唬人,但实际上真正的应用框架在ActivityThread:
NaiveStart.main()
ZygoteInit.main
ZygoteInit$MethodAndArgsCall.run
Method.Invoke
method.invokeNative
ActivityThread.main()
Looper.loop()
....
以上是应用的启动堆栈,从中可以看到真正的入口是ActivityThread
。
ActivityThread.main()
为入口启动,同时进入到Looper.loop()
创建的消息循环中。作为一个人机交互的系统,一个应用最为核心的就是消息循环与事件分发处理,而消息循环就在ActivityThread
中。除此之外,ActivityThread
还提供了一个IActivityThread
接口给Activity Service Manager(AMS)
作为与AMS通信的接口。 接下来来看看ActivityThread
是如何创建的。实际上ActivityThread
与Activity Manager Service
的关系和ViewRoot
与Window Manager Service
的关系很类似。而创建ActivityThread
的过程就有点类似于ViewRoot
的addView
。其过程大致可以分为两个步骤:
在AM本地用ProcessRecord来指代一个应用进程。同时AMS还维护两个数组:mProcessNames以及mPidsSelfLocked。两者存储的对象如下图所示:
startProcessLocked(processName,Appinfo.uid)
创建一个进程对象,类型是ProcessRecord,加入到mProcessNames数组中。在这个数组中应用通过包名和uid标识自己,如果在同一个Package中的Activity,如果都使用默认设置,那么这些Activity都会托管在同一个进程中,这是因为他们在带的ApplicationInfo中的ProcessName都是一样的。