01-16-07 代理模式 - ActivityManagerProxy与Binder代理机制

张开发
2026/4/4 12:26:53 15 分钟阅读
01-16-07 代理模式 - ActivityManagerProxy与Binder代理机制
01-16-07 代理模式 - ActivityManagerProxy与Binder代理机制代理模式是什么为其他对象提供代理以控制对这个对象的访问。Android源码中的代理实现Binder代理// IActivityManager接口interfaceIActivityManager{intstartActivity(...);voidfinishActivity(...);}// ActivityManagerService实际实现运行在system_server进程classActivityManagerServiceextendsIActivityManager.Stub{OverridepublicintstartActivity(...){// 实际启动Activity的逻辑}}// ActivityManagerProxy客户端代理classActivityManagerProxyimplementsIActivityManager{privateIBindermRemote;OverridepublicintstartActivity(...){ParceldataParcel.obtain();ParcelreplyParcel.obtain();try{data.writeInterfaceToken(descriptor);// 写入参数mRemote.transact(START_ACTIVITY_TRANSACTION,data,reply,0);reply.readException();intresultreply.readInt();returnresult;}finally{data.recycle();reply.recycle();}}}代理作用跨进程通信App进程 ↔ system_server进程透明化客户端无需关心Binder细节安全控制权限检查实战应用动态代理interfaceUserService{fungetUser(id:Int):UserfunsaveUser(user:User)}classUserServiceImpl:UserService{overridefungetUser(id:Int)User(Alice,25)overridefunsaveUser(user:User){println(Saved:$user)}}// 动态代理添加日志classLoggingProxyT(privatevaltarget:T){funcreate():T{returnProxy.newProxyInstance(target!!::class.java.classLoader,target::class.java.interfaces){_,method,args-println([Before]${method.name})valresultmethod.invoke(target,*(args?:arrayOf()))println([After]${method.name})result}asT}}// 使用valserviceLoggingProxy(UserServiceImpl()).create()service.getUser(1)// 自动打印日志总结核心思想控制对象访问透明化复杂操作增加额外功能日志、缓存、权限Android中的应用Binder代理- 跨进程通信动态代理- AOP编程Retrofit- 接口代理代理模式的核心价值是解耦和增强在不修改原对象的情况下添加功能。

更多文章