IActivityManager相关代码结构

IAM:IActivityManager

AM:ActivityManager

AMNative:ActivityManagerNative

AMProxy:ActivityManagerProxy(ActivityManagerNative的内部类)

AMS:ActivityManagerService



7.0中类的继承关系
class ActivityManagerService extends ActivityManagerNative

class ActivityManagerNative extends Binder implements IActivityManager

class Binder implements IBinder

interface IActivityManager extends IInterface

8.0中类的继承关系
class ActivityManagerService extends IActivityManager.Stub

IActivityManager.Stub类被隐藏,对比7.0的代码,可以认为IActivityManager.Stub=ActivityManagerNative

interface IActivityManager


7.0类之间的交互
在 其他进程 与 AMS 发生交互的关系网中,AMNative 扮演了中介者的角色。
展开来看
第一:
AMNative 继承了 Binder ,就获得Binder机制的进程间通信的能力;

第二:
AMNative 实现了 IActivityManager 接口,其实是留给 AMNative 的子类 AMS 去实现的,
AMNative 的 内部类 AMProxy 也实现了 IActivityManager 接口。
结合起来看,AMS 跟 AMProxy 都实现了 IActivityManager 接口,那么这两者具体的实现内容有何区别呢?
以 startActivity函数 的代码为例:代码略
由此看出,AMS 端实现的接口函数是真正做事情的,而 AMProxy 端是实现的接口是为了传递客户端的参数和调用命令的。
这里所说的客户端,处于另一个进程,它可能是一个APP,也可能是另一个Service。
换句话说,只要客户端拿到 AMProxy 的引用,就可以对 AMS 发起进程间通信了。

第三:
那客户端如何拿到 AMProxy 的引用呢?
此处以 Instrumentation.java 作为一个客户端来讲。
在7.0的代码中,Instrumentation.java 的 execStartActivity 函数,就发起了一次进程间通信。
代码:略。
上述代码中,ActivityManagerNative.getDefault()这句代码就返回了一个 IAM,而该 IAM 就是有 AMNative 内部的 AMProxy 实例化的。
由此,Instrumentation.java 就可以通过调用该 IAM 接口的 startActivity函数 ,向 AMS 发起了一次进程间通信。
而 Instrumentation.java 可以直接引用 AMNative,是因为在源码中,他们同在一个路径下
/frameworks/base/core/java/android/app/Instrumentation.java
/frameworks/base/core/java/android/app/ActivityManagerNative.java
而 AMS 在源码目录中,其路径是:/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
所以在 AMS 的代码中需要引入AMNative:import android.app.ActivityManagerNative;

第四:
此时,我们清楚了客户端是通过 AMNative 拿到 AMProxy(IAM) 的引用,然后发起进程间通信的。
获得 AMProxy(IAM) 的引用的就这句代码做了什么呢: ActivityManagerNative.getDefault()?
代码:略
关键代码:IBinder b = ServiceManager.getService("activity");
追踪代码:IActivityManager am = asInterface(b);
代码:略
关键代码:return new ActivityManagerProxy(obj)
由此,我们知道,AMNative 通过 ServiceManager 的 getService("activity") 函数调用,拿到代表 AMS 的 IBinder b,
再将 IBinder b 作为 AMProxy 构造函数的参数,实例化了 AMProxy。
在 AMProxy 内部实现的每一个 IAM 的接口函数,都是依赖 IBinder b ,再结合 AMNative 作为 Binder 子类的能力,
来实现了客户端向 AMS 传递参数和调用命令的,而这也就是进程间通信的关键。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值