AIDL相关使用,主要分为三个部分
- bindService
- 接口调用
- unbindService
private IMsgService mUserService;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
AIDLLog.w("Client->onServiceConnected");
mUserService = IMsgService.Stub.asInterface(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
AIDLLog.w("Client->onServiceDisconnected");
}
@Override
public void onBindingDied(ComponentName name) {
/**
* <p>当与该连接的绑定死亡时会调用此方法。</p>
* 这意味着接口将永远不会收到另一个连接。应用程序需要取消绑定并重新绑定该连接以重新激活它。</p>
* 例如,如果托管服务的应用程序已更新,则可能会发生这种情况。</p>
*/
AIDLLog.w("Client->onBindingDied");
}
@Override
public void onNullBinding(ComponentName name) {
AIDLLog.w("Client->onNullBinding");
/**
* <p>当服务的 onBind() 方法返回 null 时会调用此方法。这表明尝试绑定的服务连接将永远不会变得可用。</p>
* <p>应用程序必须仍然调用 Context.unbindService(ServiceConnection) 来释放与此 ServiceConnection 相关的跟踪资源;</p>
* <p></>即使在 Context.bindService() 调用后此回调被触发。</p>
*/
unBindMessageService();
}
}; Intent bindIntent = new Intent();
bindIntent.setClassName("cn.jarlen.android.aidl.server", "cn.jarlen.android.aidl.server.MessageService");
bindService(bindIntent, connection, BIND_AUTO_CREATE); unbindService(connection);2024-12-09 10:58:01.916 6158-6158/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[main,5,main]]Client->bindService
2024-12-09 10:58:01.925 6203-6203/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[main,5,main]]Server->onCreate
2024-12-09 10:58:01.925 6203-6203/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[main,5,main]]Server->onBind
2024-12-09 10:58:01.936 6158-6158/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[main,5,main]]Client->onServiceConnected2024-12-09 10:59:52.145 6158-6158/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[main,5,main]]Client->发消息:123456
2024-12-09 10:59:52.145 6158-6158/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[main,5,main]]Client->发消息Before
2024-12-09 10:59:52.147 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->sendMsg
2024-12-09 10:59:53.149 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->来消息啦:123456, Thread[Binder:6203_4,5,main]
2024-12-09 10:59:53.149 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->processClientMsg
2024-12-09 10:59:53.149 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->sendMsg,client not found
2024-12-09 10:59:53.149 6158-6158/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[main,5,main]]Client->发消息After2024-12-09 11:00:50.105 6158-6308/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[Thread-2,5,main]]Client->发消息:123456
2024-12-09 11:00:50.105 6158-6308/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[Thread-2,5,main]]Client->发消息Before
2024-12-09 11:00:50.107 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->sendMsg
2024-12-09 11:00:51.108 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->来消息啦:123456, Thread[Binder:6203_4,5,main]
2024-12-09 11:00:51.108 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->processClientMsg
2024-12-09 11:00:51.108 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->sendMsg,client not found
2024-12-09 11:00:51.109 6158-6308/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[Thread-2,5,main]]Client->发消息After2024-12-09 11:01:18.347 6158-6158/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[main,5,main]]Client->unbindService
2024-12-09 11:01:18.351 6203-6203/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[main,5,main]]Server->onUnbind
2024-12-09 11:01:18.351 6203-6203/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[main,5,main]]Server->onDestroy2024-12-09 11:03:48.763 6488-6488/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[main,5,main]]Client->addMsgObserver
2024-12-09 11:03:48.764 6203-6225/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Binder:6203_4,5,main]]Server->registerClient
- AIDL 接口业务处理隶属单独的Binder线程池
- 不管调用方在主线程还是子线程,在通过AIDL接口调用时,AIDL接口接收并处理数据均在Binder线程
- 结果返回到调用方侧后又切换为原有的线程
- AIDL接口调用是一个同步处理过程
2024-12-09 11:07:21.022 6203-6203/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[main,5,main]]Server->sendMessage
2024-12-09 11:07:22.025 6488-6511/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[Binder:6488_5,5,main]]Client->来消息啦:say hell0 from server
2024-12-09 11:07:33.345 6203-6586/cn.jarlen.android.aidl.server W/AIDL2024: [Thread[Thread-2,5,main]]Server->sendMessage
2024-12-09 11:07:34.346 6488-6511/cn.jarlen.android.aidl.client W/AIDL2024: [Thread[Binder:6488_5,5,main]]Client->来消息啦:say hell1 from server
