关于Binder连接池的跨应用使用方法

Posted 玉刚说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Binder连接池的跨应用使用方法相关的知识,希望对你有一定的参考价值。

读过《android开发艺术探索》的朋友都不默认,书中提出了Binder连接池的概念。Binder连接池的概念这里不再介绍,本文要说的是另一个问题:如果在两个应用之间采用Binder连接池?


书中对Binder连接池做了详细的介绍,但是例子中并未涉及到两个应用的情况。最近有一些读者问我如何在两个应用之间采用Binder连接池,下面就做一下介绍。(用AndroidStudio或者Eclipse都可以)


思想

按照AIDL的规范,只需要将IBinderPool.aidl、ICompute.aidl和ISecurityCenter.aidl这三个AIDL文件以及BinderPool.java copy到客户端的工程中,注意包名要保持一致,然后就可以了。很简单对吧,但是有读者对此表示有疑问,所以我就在这里详细地演示一遍,步骤如下。


第一步 改造BinderPoolImpl

将BinderPoolImpl从BinderPool中转移到BinderPoolService中。按照任务划分,BinderPool应该运行在客户端中,所以和服务端相关的代码都需要转移到服务端中。因此,我们需要把BinderPoolImpl移到BinderPoolService中,同时BinderPool中的常量也同时移动到BinderPoolService中


第二步 copy三个AIDL文件和BinderPool到客户端工程中

调整后的项目结构如下所示。


服务端工程结构:



客户端工程结构:



第3步 微调客户端中的BinderPool

BinderPool中需要绑定远程服务,由于服务在另外一个工程中,所以需要通过隐式调用的方式来绑定服务:

private synchronized void connectBinderPoolService() {

mConnectBinderPoolCountDownLatch = new CountDownLatch(1);

Intent service = new Intent("com.ryg.BinderPoolService.launch");

mContext.bindService(service, mBinderPoolConnection,

Context.BIND_AUTO_CREATE);

try {

mConnectBinderPoolCountDownLatch.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

}


第4步 在客户端中使用BinderPool

private void doWork() {

BinderPool binderPool = BinderPool.getInsance(this);

IBinder securityBinder = binderPool.queryBinder(BinderPool.BINDER_SECURITY_CENTER);

ISecurityCenter mSecurityCenter = ISecurityCenter.Stub.asInterface(securityBinder);

Log.d(TAG, "visit ISecurityCenter");

String msg = "helloworld-安卓";

System.out.println("content:" + msg);

try {

String password = mSecurityCenter.encrypt(msg);

System.out.println("encrypt:" + password);

System.out.println("decrypt:" + mSecurityCenter.decrypt(password));

} catch (RemoteException e) {

e.printStackTrace();

}


Log.d(TAG, "visit ICompute");

IBinder computeBinder = binderPool.queryBinder(BinderPool.BINDER_COMPUTE);

ICompute mCompute = ICompute.Stub.asInterface(computeBinder);

try {

System.out.println("3+5=" + mCompute.add(3, 5));

} catch (RemoteException e) {

e.printStackTrace();

}

}


到这里,整个过程就分析完成了,大家可以自己试试。可以发现,在两个应用之间使用BinderPool,和在一个应用的两个进程之间使用BinderPool,它们的流程几乎是一致的。



以上是关于关于Binder连接池的跨应用使用方法的主要内容,如果未能解决你的问题,请参考以下文章

Binder线程池的启动流程分析

Binder线程池的启动流程分析

这个关于连接池的结论,你绝对想不到

Swoole MySQL 连接池的实现

知了堂学习笔记--关于对Node.js访问数据库连接池的理解与简单的建立---@wan<

关于c3p0数据库连接池的简单使用