我的Android学习和总结之:App进程与AMS之间的通信方式(调用方式)

App进程与AMS之间的通信方式
App与ActivityManagerService之间是通过Binder通信的,具体涉及到的类调用关系通过几张图片总结如下。
APP如何调用AMS方法
我的Android学习和总结之:App进程与AMS之间的通信方式(调用方式)_第1张图片

AMS如何调用App方法

我的Android学习和总结之:App进程与AMS之间的通信方式(调用方式)_第2张图片

总结APP与AMS通信框架如下
我的Android学习和总结之:App进程与AMS之间的通信方式(调用方式)_第3张图片

我们来理下IActivityManager ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系。
(1)IActivityManager:是一个接口类,定义了很多接口
(2)ActivityManager:是暴露给APP的接口API,在APP进程中作为jar包API调用的。
(3)ActivityManagerService:Android系统组件的核心服务,继承了ActivityManagerNative类
(4)ActivityManagerNative:一个抽象的类,继承Binder类,实现IActivityManager接口,由于继承了Binder类,他就拥有了远程通信的条件。实现了IActivityManager接口,他能够得到ActivityManager管理关于内存、任务等内部信息。那么AMS作为AMN的子类也就自然享有了这些特性。
(5)ActivityManagerProxy:ActivityManagerProxy也实现了IActivityManager接口,ActivityManager(即为APP端)与AMS远程通信的代理。
通过ActivityManagerNative.getDefault() 的方式获取。
(6)ActivityManagerNative.getDefault() 返回的就是ActivityManagerNative的内部类ActivityManagerProxy,这个代理的构造方法需要传入一个服务端的IBinder,而IBinder 又是ActivityManagerNative的gDefault 内部create方法时从ServiceManager那里取得的。具体看下面代码。

(7)举例说明APP端(即为客户端)调用AMS的getAppTasks流程:
ActivityManager中的方法getAppTasks:
public List getAppTasks() {
ArrayList tasks = new ArrayList();
List appTasks;
try {
appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}

return tasks;
}
/**
* Retrieve the system’s default/global activity manager.
/
static public IActivityManager getDefault() {
return gDefault.get();
}
private static final Singleton gDefault = new Singleton() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService(“activity”);
if (false) {
Log.v(“ActivityManager”, "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v(“ActivityManager”, "default service = " + am);
}
return am;
}
};
/
*
* Cast a Binder object into an activity manager interface, generating
* a proxy if needed.
/
static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj);
}
/
*
* Cast a Binder object into an activity manager interface, generating
* a proxy if needed.
*/
static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj);
}
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(caller != null ? caller.asBinder() : null);
data.writeString(callingPackage);
intent.writeToParcel(data, 0);
data.writeString(resolvedType);
data.writeStrongBinder(resultTo);
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(startFlags);
if (profilerInfo != null) {
data.writeInt(1);
profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
if (options != null) {
data.writeInt(1);
options.writeToParcel(data, 0);
} else {
data.writeInt(0);
}
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
reply.readException();
int result = reply.readInt();
reply.recycle();
data.recycle();
return result;
}
调用getAppTasks首先要调用ActivityManagerNative.getDefault()获取一个ActivityManagerProxy对象,ActivityManagerProxy实现IActivityManager接口,所以也有getAppTasks这个函数,然后它把参数进行序列化以后又调用mRemote.transact的函数,mRemote是什么?
他就是远程服务AMS的IBinder,在创建ActivityManagerProxy对象的时候传递进去的,而IBinder 又是ActivityManagerNative的gDefault 内部create方法时从ServiceManager那里取得的。ActivityMangerProxy远程调用后,到了AMS端的ActivityManagerNative的onTransact函数,因为ActivityManagerService继承了ActivityManagerNative类,因此AMS也实现了getAppTasks接口,所以最终就调用到AMS的getAppTasks接口。

AMS与ActivityManager的通信实现
我的Android学习和总结之:App进程与AMS之间的通信方式(调用方式)_第4张图片
参考文章链接:
https://blog.csdn.net/weitangzhu_2008/article/details/86680715
https://www.jianshu.com/p/194a37755fea
https://blog.csdn.net/kc58236582/article/details/50394905

你可能感兴趣的:(我的Android学习和总结之:App进程与AMS之间的通信方式(调用方式))