# Hzh_learning **Repository Path**: hzhaiw/hzh_learning ## Basic Information - **Project Name**: Hzh_learning - **Description**: young 自己学习的 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-13 - **Last Updated**: 2025-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 视频:https://www.bilibili.com/video/BV1zM411574w/?spm_id_from=autoNext&vd_source=e07cc8cc94eb22bd76722071b03cd199 资料:源码&PPT【https://github.com/linxu-link/CarAndroidCourse】 个人博客【https://juejin.cn/user/870468939434039/posts】 个人微信公众号【车载Android】 基础: aidl-base-client:学习AIDL 的客户端 aidl-base-server:学习AIDL 的服务端 aidl-base-sdk:将AIDL的接口封装到这里,就不需要去客户端和服务端都写一遍,直接依赖这个即可 服务端: 1. 服务在清单文件中注册: ```text ``` 2. 在 Android8.0 及之后的系统中,需要使用Notification将service设置有前台service,否则会抛出异常 ```text 客户端: 客户端要访问服务端,需要显示声明服务端的包名 ``` 3. 声明一个文件(Sample.aidl),来声明 Parcelable 的类,这个 aidl 文件,不需要任何调用,框架会自行处理 4. Serializable 的参数,在 AIDL 中,不需要放在 Parcelable 传递 5. 传输大文件的时候,可以使用 ParcelFileDescriptor ParcelFileDescriptor pdf ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); ParcelFileDescriptor.AutoCloseInputStream inputStream = new ParcelFileDescriptor.AutoCloseInputStream(pdf) 6. 避免 AIDL 引起的ANR,主要是在客户端主线程调用了 AIDL 接口,然后服务端那边做了耗时操作,其实就是变成了客户端在主线程做了耗时操作 导致界面长时间无响应,导致了ANR; 建议:不要在主线程调用AIDL接口,要在异步调用 不要在onServiceConnected()或者 onServiceDisConnected()中直接操作服务端方法,因为这些方法是在主线程中执行的。 使用oneway键字来修饰AIDL 接口,使得IPC调用变成非阻塞的。 7. oneway 不能修饰有返回值的方法或者抛出异常的方法,客户端不会接收到这些信息,因为oneway不进行序列化和反序列化,就不会阻塞了。 8. 进程共享数据,连接同一个service,service是同一个,但是 binder 不是,所以共享的数据,放到 Service 中即可; 9. ServiceConnection#onServiceConnected 的 IBinder 参数,在服务端则是服务端自身的 Service 对象(CalculatorService),在客户端 则是 BinderProxy,也就是客户端只可以通过 ICalculator.Stub 操作数据。