Skip to content

Repository files navigation

利用android IPC AIDL技术,实现客户端与服务端通讯。

概述

AIDL相关使用,主要分为三个部分

  • bindService
  • 接口调用
  • unbindService

bindService

	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

 unbindService(connection);

Android AIDL调用方法活动周期

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->onServiceConnected
2024-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->发消息After
2024-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->发消息After
2024-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->onDestroy
2024-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

Android AIDL调用方法线程切换

  • 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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages