# 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 操作数据。