Android(安卓)Binder机制(一)
16lz
2021-01-25
原文链接: https://my.oschina.net/u/1474965/blog/872847
binder用于android进程间的通讯。客户端程序和系统服务,客户端进程之间,都是通过binder进行进程间通讯的。
1.客户端程序和系统服务
客户端和系统服务通讯的入口:cotext.getSystemService(String name)
android.app.ContextImpl:
@Override public Object getSystemService(String name) { return SystemServiceRegistry.getSystemService(this, name); }
android.app.SystemServiceRegistry:
静态代码块注册系统服务:
static { registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class, new CachedServiceFetcher() { @Override public AccessibilityManager createService(ContextImpl ctx) { return AccessibilityManager.getInstance(ctx); }}); registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class, new CachedServiceFetcher() { @Override public CaptioningManager createService(ContextImpl ctx) { return new CaptioningManager(ctx); }}); registerService(Context.ACCOUNT_SERVICE, AccountManager.class, new CachedServiceFetcher() { @Override public AccountManager createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE); IAccountManager service = IAccountManager.Stub.asInterface(b); return new AccountManager(ctx, service); }});....
ServiceManager、ServiceManagerNative:
serviceManager是管理系统服务的一个工具类。
sServiceManager = ServiceManagerNative .asInterface(Binder.allowBlocking(BinderInternal.getContextObject()));
getService方法:利用ServiceManagerProxy类通过进程间通讯的方式,获取其他服务在binder驱动中的binder对象mRemote。
xxx.Stub.asInterface(binder):
利用getService获取到的binder对象实例化相应服务的Proxy对象,返回给客户端,供客户端使用。
返回系统服务:
/** * Gets a system service from a given context. */ public static Object getSystemService(ContextImpl ctx, String name) { ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name); return fetcher != null ? fetcher.getService(ctx) : null; }
2.客户端之间
B应用进程调用A应用进程
B bindservice 向AmS请求启动B应用的service。启动service成功后会像AmS返回一个(binder驱动中的mRemote)binder,AmS会以该binder为参数调用ActivityThread类中的ApplicatonThread对象。接着会在ApplicationThread中回调conn接口。最后,B进程可以利用该binder调用A应用提供的功能。
转载于:https://my.oschina.net/u/1474965/blog/872847
更多相关文章
- Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- 一款霸榜 GitHub 的开源 Linux 资源监视器!
- Android(安卓)Socket实例(2)
- Android(安卓)请求Root权限代码
- Android(安卓)Studio ADB响应失败解决方法
- Android各版本系统源代码下载
- Android(安卓)RIL 本地代码(c/c++) 和 Java代码部分分析