首先是对AMS持有的对象代理
C:客户端App所在进程
S: AMS服务所在进程
IActivityManager 接口
public abstract class ActivityManagerNative {
static public IActivityManager asInterface(IBinder obj) {
return IActivityManager.Stub.asInterface(obj);
}
static public IActivityManager getDefault() {
return ActivityManager.getService();
}
所以跟进ActivityManager.getService()
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
这是一个单例模式,首先获取远程服务的Binder接口,然后经典的asInterface转成定义的接口即可。获取远程服务都是从ServiceManager管家类获取
思考:app本身的进程如果获取远程服务AMS,是先拿到相应的Binder接口,然后获取代理来完成。