Android核心分析之AMS

App和AMS(SystemServer进程)还有zygote进程分属于三个独立的进程

App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。

打开一个APP

Launcher

Launcher负责桌面图标的显示和控制,本质上也是一个应用程序,和我们的App一样,也是继承自Activity

以双击打开一个APP为例:

不管在哪里点击图标,都会调用

  1. mLauncher.startActivitySafely(v, appInfo.intent, appInfo);

这个方法,最后调用startActivityForResult()

而startActivityForResult()调用的是mInstrumentation.execStartActivity()。

Instrumentation

Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
 
AMS是董事会,负责指挥和调度的,ActivityThread是老板,虽然说家里的事自己说了算,但是需要听从AMS的指挥,而Instrumentation则是老板娘,负责家里的大事小事,但是一般不抛头露面,听一家之主ActivityThread的安排。
 

AMS和ActivityThread之间的Binder通信

mInstrumentation.execStartActivity()接下来调用了这个方法

  1. ActivityManagerNative.getDefault()
  2. .startActivity

这里的ActivityManagerNative.getDefault返回的就是ActivityManagerService的远程接口,即ActivityManagerProxy。

再看ActivityManagerProxy.startActivity(),在这里面做的事情就是IPC通信,利用Binder对象,调用transact(),把所有需要的参数封装成Parcel对象,向AMS发送数据进行通信。

ActivityManagerNative源码:

  1. public abstract class ActivityManagerNative extends Binder implements IActivityManager
  2. {
  3.  
  4. //从类声明上,我们可以看到ActivityManagerNative是Binder的一个子类,而且实现了IActivityManager接口
  5. static public IActivityManager getDefault() {
  6. return gDefault.get();
  7. }
  8.  
  9. //通过单例模式获取一个IActivityManager对象,这个对象通过asInterface(b)获得
  10. private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
  11. protected IActivityManager create() {
  12. IBinder b = ServiceManager.getService("activity");
  13. if (false) {
  14. Log.v("ActivityManager", "default service binder = " + b);
  15. }
  16. IActivityManager am = asInterface(b);
  17. if (false) {
  18. Log.v("ActivityManager", "default service = " + am);
  19. }
  20. return am;
  21. }
  22. };
  23. }
  24.  
  25. //最终返回的还是一个ActivityManagerProxy对象
  26. static public IActivityManager asInterface(IBinder obj) {
  27. if (obj == null) {
  28. return null;
  29. }
  30. IActivityManager in =
  31. (IActivityManager)obj.queryLocalInterface(descriptor);
  32. if (in != null) {
  33. return in;
  34. }
  35.  
  36. //这里面的Binder类型的obj参数会作为ActivityManagerProxy的成员变量保存为mRemote成员变量,负责进行IPC通信
  37. return new ActivityManagerProxy(obj);
  38. }
  39.  
  40. }

很清楚看到ActivityManagerNative继承Binder,是Binder本地对象。IActivityManager是远程接口,代表AMS能提供的功能。

ActivityManagerProxy是AMS的远程代理对象,Activity可以通过代理对象调用AMS提供的接口中方法。

所以App与AMS通过Binder进行IPC通信

AMS向ActivityThread通信

以上解释了activity向AMS通信的方法,

如果AMS想要通知ActivityThread做一些事情,应该咋办呢?

还是通过Binder通信,不过是换了另外一对,换成了ApplicationThread和ApplicationThreadProxy。

  1. private class ApplicationThread extends ApplicationThreadNative {}
  2.  
  3. public abstract class ApplicationThreadNative extends Binder implements IApplicationThread{}
  4.  
  5. class ApplicationThreadProxy implements IApplicationThread {}

AMS接收到客户端的请求之后,会如何开启一个Activity?

可以看上面那个图,大致就是AMS得到activity栈的引用,然后根据启动模式添加到栈中,最后回调applicationThread执行原activity的pause

广播

为什么需要广播

广播是操作系统framework层对观察者模式(observer)最常用的实现方式

一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作。观察者模式是满足这一要求的各种设计方案中最重要的一种。

广播发送的api有:
•sendBroadcast
•sendOrderBroadcast
•sendStickyBroadcast
监听广播的方式有:
•动态注册使用registerReceiver方式
•静态注册在AndroidManifest.xml中定义BroadcastReceiver类并实现

广播有哪几种

广播有无序广播、有序广播和粘性广播,其中粘性广播需要有BROADCAST_STICKY权限

Service

Service是什么

Service是Android系统的组件之一,和Activity,Broadcast,Conent Provider并称Android四大组件,Service是不可见的,是没有界面的,是在后台运行的,Service一般处理比较耗时以及长时间运行的操作

Service的启动有两种方式:

1. startService主要用于启动一个服务执行后台任务,不进行通信,停止服务使用stopService

2. bindService该方法启动的服务可以获得该service的状态,停止服务使用unbindService

Android - AMS源码分析的更多相关文章

  1. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

  2. Appium Android Bootstrap源码分析之命令解析执行

    通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...

  3. Appium Android Bootstrap源码分析之控件AndroidElement

    通过上一篇文章<Appium Android Bootstrap源码分析之简介>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的 ...

  4. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我又有一 个耗时任务需要执行,我们不得不重新创建线 ...

  5. Android Choreographer 源码分析

    Choreographer 的作用主要是配合 Vsync ,给上层 App 的渲染提供一个稳定的 Message 处理的时机,也就是 Vsync 到来的时候 ,系统通过对 Vsync 信号周期的调整, ...

  6. Appium Android Bootstrap源码分析之简介

    在上一个系列中我们分析了UiAutomator的核心源码,对UiAutomator是怎么运行的原理有了根本的了解.今天我们会开始另外一个在安卓平台上基于UiAutomator的新起之秀--Appium ...

  7. Android base-adapter-helper 源码分析与扩展

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44014941,本文出自:[张鸿洋的博客] 本篇博客是我加入Android 开源项 ...

  8. android消息处理源码分析

    一.简介消息处理机制主要涉及到这几个类:1.Looper2.MessageQueue3.Message4.Handler 二.源码分析 Looper.class的关键源码: //保存Looper对象, ...

  9. Android -- ViewGroup源码分析+自定义

    1,我们前三篇博客了解了一下自定义View的基本方法和流程 从源码的角度一步步打造自己的TextView 深入了解自定义属性 onMeasure()源码分析 之前,我们只是学习过自定义View,其实自 ...

随机推荐

  1. ConcurrentHashMap源码解析(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http:/ ...

  2. cad2019卸载/安装失败/如何彻底卸载清除干净cad2019注册表和文件的方法

    cad2019提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2019失败提示cad2019安装未完成,某些产品无法安装,也有时候想重新安装cad2019 ...

  3. HDU - 2604 Queuing(递推式+矩阵快速幂)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. 详述MSSQL服务在渗透测试中的利用 (下篇)

    part3 MSSQL写文件 步骤1 sp_makewebtask写文件 因为是`SA`权限,如果目标服务器是web服务器,我们也不用去备份了,可以直接写个一句话木马进去到web目录. 在不知道web ...

  5. FTP服务安装与端口说明

    FTP服务安装与端口说明 FTP端口修改安装部署windowswindows 2012文件服务 1. FTP服务介绍 1.1 什么是FTP FTP(File Transfer Protocol)是文件 ...

  6. webApp开发中的总结

    meta标签:  H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...

  7. One-hot数据处理

    机器学习 数据预处理之独热编码(One-Hot Encoding)(转) 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male&q ...

  8. JavaSE-序列化和反序列化

    什么是序列化,什么时候要进行序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输. 我们在对java对象进行IO流操作 ...

  9. OpenShift Redhat 搭建NodeJS环境

    https://openshift.redhat.com/ OpenShift 是 redhat 公司推出的一个 PaaS 云计算应用平台,开发者可在上面构建.测试.部署和运行应用程序,它支持 Jav ...

  10. Activity四大启动模式

    ctivity的四种启动模式: standard.singleTop.singleTask.singleInstance 为了打印方便,定义一个基础Activity,在其onCreate方法和onNe ...