学习AmS有段时日了,总结下,也好梳理一下自己的思路。小兵一个,有些地方理解不对,大家可以互相讨论,交流才有进步吗~~~

AmS可以说是Android上层系统最核心的模块之一,其主要完成管理应用进程的生命周期以及进程的Activity,Service,Broadcast和Provider等。

从系统运行的角度看,AmS可以分为Client端和Service端:Client端运行在各个app进程,app进程实现了具体的Activity,Service等,告诉系统我有那些Activity,Service等,并且调用系统接口来完成显示;Service端运行在SystemServer进程,是系统级别的ActivityManagerService的具体实现,其响应Client端的系统调用请求,并且管理Client端各个app进程的生命周期。

图1 AmS基本类图

如上面AmS基本类图,在Client端,我们平常接触的Application,Service和Activity都是Context的子类,Context理解为环境,上下文,也就是它能够告诉系统当前我运行的Activity,Service的情况,显示那些View,干那些活等。Context是一个abstract类,定义的方法具体实现在ContextImpl中,ContextWrapper作为Context的装饰类,里面的成员变量mBase指向ContextImpl,当然这儿并不是一定要执行ContextImpl,只要是继承了Context,实现了里面定义的接口,都可以实例化mBase对象。

另外我们注意到我们调用很多Android的接口,必须要传入Context对象,通常我们直接将Activity对象作为参数传入,如果方法内部定义全局变量或者static的变量,导致长期占用mContext引用,这就会导致Activity对象无法被JVM回收,对此这样的引用占用,很可能导致OOM。我们注意到Application也是继承自Context,所以Application也是Context,我们知道Application在一个应用启动时就创建,所以我们的app一直存在着全局的Context对象——Application对象,那么我们在一些已知的全局占用Context对象引用的方法调用上可以传递Application对象来避免上面所说的OOM。

IActivityManager接口定义了app访问AmS的接口,主要是应用请求AmS要完成某些操作,比如启动、finish某个Activity,启动、stop某个Service。ActivityManagerService实现了IActivityManager中定义的接口,该类可以说是AmS的核心,AmS的所有具体工作基本上都在该类中或者通过该类控制,ActivityManagerService的实例在进程SystemServer刚启动时初始化。IApplicationThread接口定义了AmS可以访问app的接口,AmS通过这些接口控制app进程以及完成app的响应,ApplicationThread是IApplicationThread接口的具体实现,ApplicationThread的实例是在app进程启动时创建ActivityThread对象时初始化,ActivityThread的成员变量mAppThread就是ApplicationThread对象。另外为了实现跨进程调用,ActivityManagerProxy和ApplicationThreadProxy分别实现了IActivityManager和IApplicationThread接口,其作为各自的代理供client和server使用。

AmS也是作为一个系统服务,通过ActivityManager定义了一些借口可以供app使用,ActivityManager中访问AmS的接口都是通过ApplicationThreadProxy实现的。

如下图是AmS内部主要数据结构类图,看了code相信大家都会知道这些类都是干什么的,这儿只是总结一下。

Android ActivityManagerService 基本构架详解的更多相关文章

  1. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  2. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  3. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  4. android bundle存放数据详解

    转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...

  5. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

  6. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  7. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

  8. Android中mesure过程详解

    我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...

  9. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

随机推荐

  1. SQL Server游标+延迟执行简介

    在项目测试中,我们可能会使用批量生成数据来测试程序的性能. 这里讲一个我遇到的问题,由于我们批量生成数据时基本上是瞬间完成,所以GETDATE()函数获得的时间基本上也是一样的,而我们又要求生成每条数 ...

  2. Android开发5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

  3. (五)Hibernate 操作对象

    所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 中四种对象状态 临时状态(transient ...

  4. iOS开发——常用字符串string相关方法和处理

    (持续更新中……) 1,四舍五入 2,剔除字符 3,拼接字符 4,字符个数和长度 5,字符串的比较 6,字符串的范围 7,字符串转Number类型

  5. CSS边框属性二---border-images

    border-images 属性 主要用border-images 属性来制作自适应按钮和tab标签&自适应边框. 例子: border-images:url("img.png&qu ...

  6. 01_JavaMail_03_邮件发送简单实例

    [JavaMail中的核心类] 1.Session:类似Jdbc中的Connection的作用 2.MimeMessage:邮件信息类 3.Transport:发送器,用来发送邮件 [工程截图] [具 ...

  7. 学习笔记---C++伪函数(函数对象)

    C++里面的伪函数(函数对象)其实就是一个类重载了()运算符,这样类的对象在使用()操作符时,看起来就像一个函数调用一样,这就叫做伪函数. class Hello{ public: void oper ...

  8. css按钮自适应

    原理:利用a标签和i标签各自一个背景组合成为按钮,达到自适应. <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  9. 对typesafe enum模式的改进

    按照一些资料上讲,其实enum也就是在编译器层面实现用类来包装枚举(typesafe enum 模式)的思想.以保证类型安全.自己用类来写枚举其实效果也还是不错的,只是代码略显啰嗦. 例子代码 pub ...

  10. notepad++ :正则表达式系统教程

    前言&索引 前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感.只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题. 索 ...