Android应用框架之Application&ActivityThread
2016-09-13 23:28
441 查看
不同于其他系统,在Android中Application并不是一个重要的概念,甚至开发人员在开发的过程中很少需要直接与Application打交道,其提供的也仅仅是一个上下文环境。至于为什么会这样,还是与设计者的设计思想有关。Android的设计者希望呈现给用户的是一个组件化的操作系统,开发者只需要与
但是Android毕竟是给予Linux的,一个应用程序需要跑起来也必须依托于一个进程之上,所有的组件也必须寄宿在某一个进程之上。所以Application实际上是一个容器或者宿主,用于盛放各个组件。
当第一个
NaiveStart.main()
ZygoteInit.main
ZygoteInit$MethodAndArgsCall.run
Method.Invoke
method.invokeNative
ActivityThread.main()
Looper.loop()
….
以上是应用的启动堆栈,从中可以看到真正的入口是
应用程序以
接下来来看看
- 1 Activity Manager创建进程
- 2 被创建的进程attach到Activity Manager,建立与AM之间的联系
ActivityManager创建进程
在AM本地用ProcessRecord来指代一个应用进程。同时AMS还维护两个数组:mProcessNames以及mPidsSelfLocked。两者存储的对象如下图所示:
- 1)Activity Manager Service首先通过
- 2)android.app.ActivityThread进程启动。Android.app.ActivityThread进程建立后,将跳入到ActivityThread的main函数开始运行,进入消息循环。应用进程使用thread.attach()发起AMS的AttachApplicationLocked调用,并传递 ActvitiyThread对象和CallingPid。AttachApplicationLocked将根据CallingPid在mPidsSelfLocked找到对应的ProcessRecord实例app,将ActvitiyThread放置在app.thread中。这样应用进程和AMS建立起来双向连接。AM可以使用AIDL接口,通过app.thread可以访问应用进程的对象。
-
Activity,
Service,
BroadcatReceiver,
ContentProvider进行交互就行了,并且上述这些组件才是Android的核心概念。
但是Android毕竟是给予Linux的,一个应用程序需要跑起来也必须依托于一个进程之上,所有的组件也必须寄宿在某一个进程之上。所以Application实际上是一个容器或者宿主,用于盛放各个组件。
当第一个
Activity被创建时,系统会为通过
makeApplication方法创建一个Application实例,同时也会创建一个进程。默认情况下这个进程的名字和包名相同。当然开发者也可以通过
android:process=name的方式设定进程名。之后再创建其他组件时,也会被放入到这个进程中。
ActivityThread
尽管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。其过程大致可以分为两个步骤:
- 1 Activity Manager创建进程
- 2 被创建的进程attach到Activity Manager,建立与AM之间的联系
ActivityManager创建进程
在AM本地用ProcessRecord来指代一个应用进程。同时AMS还维护两个数组:mProcessNames以及mPidsSelfLocked。两者存储的对象如下图所示:
- 1)Activity Manager Service首先通过
startProcessLocked(processName,Appinfo.uid)创建一个进程对象,类型是ProcessRecord,加入到mProcessNames数组中。在这个数组中应用通过包名和uid标识自己,如果在同一个Package中的Activity,如果都使用默认设置,那么这些Activity都会托管在同一个进程中,这是因为他们在带的ApplicationInfo中的ProcessName都是一样的。
- 2)android.app.ActivityThread进程启动。Android.app.ActivityThread进程建立后,将跳入到ActivityThread的main函数开始运行,进入消息循环。应用进程使用thread.attach()发起AMS的AttachApplicationLocked调用,并传递 ActvitiyThread对象和CallingPid。AttachApplicationLocked将根据CallingPid在mPidsSelfLocked找到对应的ProcessRecord实例app,将ActvitiyThread放置在app.thread中。这样应用进程和AMS建立起来双向连接。AM可以使用AIDL接口,通过app.thread可以访问应用进程的对象。
-
相关文章推荐
- Android应用框架之AndroidApplication
- Android核心分析之(21)Android应用框架之AndroidApplication
- Android 开源框架Glide应用(二)_占位&动画&Gif
- Android应用框架之 Application
- Android 小应用 - "Smart help" 的设计背景及框架说明
- Android核心分析(21)----Android应用框架之AndroidApplication
- Android源码之DeskClock (三) Proxy/Delegate Application 框架应用
- Android核心分析(21)----Android应用框架之AndroidApplication
- Android核心分析之二十一Android应用框架之AndroidApplication
- Android核心分析之二十一Android应用框架之AndroidApplication
- 【Android高级】应用开发必需要掌握的框架<Volley>
- Android应用框架之AndroidApplication
- Android核心分析(21)----Android应用框架之AndroidApplication
- Android应用框架之Android Application
- 穿针引线,帮你回忆, 汇总:Android系统启动流程 & 应用程序'进程'启动 & 应用'程序'启动流程(框架图、流程图、时序图)
- 如何利用an-aw-base框架快速开发android应用application
- Android开源client之LookAround学习(一)Application & 网络框架
- 几种典型的 iOS & Android 应用界面的交互框架各自的优缺点 -- 知乎 + Navigation Drawer
- Android核心分析(21)----Android应用框架之AndroidApplication
- Android核心分析(21)----Android应用框架之AndroidApplication