public int add(int a, int b) throws RemoteException {
return a + b;
}
}
业务模块都有了,我们要创建一个Binder连接池需要的AIDL,这里是一个代理或工厂,根据标识返回对应Binder
// IBinderPool.aidl
package com.breezehan.ipc.binderpool;
interface IBinderPool {
IBinder queryBinder(int binderCode);
}
在连接池中实现,根据标识返回不同Binder
static class BinderPoolImpl extends IBinderPool.Stub {
@Override
public IBinder queryBinder(int binderCode) throws RemoteException {
IBinder binder =null;
switch (binderCode) {
case BINDER_COMPUTE:
binder = new ComputeImpl();
break;
case BINDER_SECURITY_CENTER:
binder = new SecurityCenterImpl();
break;
}
return binder;
}
}
Service比较简单,逻辑处理都放在Binder线程池中
package com.breezehan.ipc.binderpool;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class BinderPoolService extends Service {
private static final String TAG = “BinderPoolService”;
private IBinder binderPool = new BinderPool.BinderPoolImpl();
public BinderPoolService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, “onBind”);
return binderPool;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
Binder线程池的具体实现,同时需处理Binder死亡代理问题。
public class BinderPool {
private static final String TAG = “BinderPool”;
public static final int BINDER_NONE = -1;
public static final int BINDER_COMPUTE = 0;
public static final int BINDER_SECURITY_CENTER = 1;
private static volatile BinderPool sInstance;//确保并发取值正确性
private final Context mContext;
//控制多个线程时,某一线程中代码执行顺序;是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行
private CountDownLatch mConnectBinderPoolCountDownLatch;
private IBinderPool mBinderPool;
public BinderPool(Context context) {
mContext = context.getApplicationContext();
connectBinderPoolService();
}
private void connectBinderPoolService() {
mConnectBinderPoolCountDownLatch = new CountDownLatch(1);
Intent service = new Intent(mContext, BinderPoolService.class);
mContext.bindService(service, mServiceConnection, Context.BIND_AUTO_CREATE);
try {
mConnectBinderPoolCountDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static BinderPool getInstance(Context context) {
if (sInstance == null) {
synchronized (BinderPool.class) {
if (sInstance == null) {
sInstance = new BinderPool(context);
}
}
}
return sInstance;
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mBinderPool = IBinderPool.Stub.asInterface(service);
try {
mBinderPool.asBinder().linkToDeath(mBinderDeathRecipient, 0);
} catch (RemoteException e) {
e.printStackTrace();
}
mConnectBinderPoolCountDownLatch.countDown();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private IBinder.DeathRecipient mBinderDeathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
Log.w(TAG, "binderDied: ");
mBinderPool.asBinder().unlinkToDeath(mBinderDeathRecipient, 0);
mBinderPool = null;
connectBinderPoolService();
}
};
public IBinder queryBinder(int bindCode) {
IBinder binder = null;
try {
binder = mBinderPool.queryBinder(bindCode);
} catch (RemoteException e) {
e.printStackTrace();
}
return binder;
}
static class BinderPoolImpl extends IBinderPool.Stub {
@Override
public IBinder queryBinder(int binderCode) throws RemoteException {
IBinder binder =null;
switch (binderCode) {
case BINDER_COMPUTE:
binder = new ComputeImpl();
break;
case BINDER_SECURITY_CENTER:
binder = new SecurityCenterImpl();
break;
}
return binder;
}
}
}
Activity中模拟使用。此处我只使用了其中一个Binder。
public class BinderPoolActivity extends AppCompatActivity {
private static final String TAG = “BinderPoolActivity”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_binder_pool);
new Thread(new Runnable() {
@Override
public void run() {
doWork();
}
}).start();
}
private void doWork() {
BinderPool binderPool = BinderPool.getInstance(BinderPoolActivity.this);
IBinder securityBinder = binderPool.queryBinder(BinderPool.BINDER_SECURITY_CENTER);
// ISecurityCenter iSecurityCenter = ISecurityCenter.Stub.asInterface(securityBinder);
ISecurityCenter iSecurityCenter = SecurityCenterImpl.asInterface(securityBinder);
Log.d(TAG, “visit ISecurityCenter”);
String msg = “helloworld-安卓”;
try {
String encrypt = iSecurityCenter.encrypt(msg);
Log.d(TAG, “doWork,encrypt:”+encrypt);
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
063985)]
[外链图片转存中…(img-5ckuvZvd-1715503063990)]
[外链图片转存中…(img-WSWmDwCA-1715503063992)]
[外链图片转存中…(img-1eK3NFfv-1715503063993)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!