水一篇以前写的文章🤣
Binder是Android内置的一种比较高效的跨进程机制,它很复杂,也很好用,可以让我们像调用普通方法那样完成跨进程式方法调用和数据传递。我们现在只需要知道它比较复杂以及怎么使用即可。
ALDL全名Android interface Definition Language, 是Android官方提供的简化Binder开发的工具,适用于Java、Kotlin开发。
所以很明显了,ALDL是小, Binder是大。
对于Binder的使用可以分为两种使用方式
- 基于ALDL的标准用法(重点了解,因为是推荐方式)
- 手动实现Binder 知道有这种情况即可
基于ALDL的标准用法
以Activity调用书籍管理中addBook(), addBook()在另外一个进程中的类设计为例:先给出以下设计图。
IBinder不能脱离Service使用的。必须要将您自己写的IBinder给到Service的onBind()方法中返回。原因我从根上讲一下:
- 首先IBinder就是用来跨进程传递数据,调用方法的。相当于让我们以一种比较符合用户习惯的方式来向往常调用方法那样去跨进程。
- 其次,Android的上层并没有提供开辟新的进程的API。也就是您完全没有权利开新进程。全部收回。
- 那么您怎么开启新的进程呢? 开一个Service是一种方式。也没什么更好的方式,这个Service是由Android系统生成的给你用的。但是你需要在其onBind()方法中给到你的自定义IBinder。这个onBinder系统在JVM生成你的自定义Service实例后会调用这个方法,以获取您自定义的专用于跨进程的IBinder!
- 当系统给到的Service连接成功时, 会在ServiceConnection中onServiceConnected()返回已经在底层Binder驱动中注册好的,您自定义的Binder对象代理。 这个ServiceConnection一般会被写在您的客户端,通常是Activity,进程A中,并在初始化自定义服务的时候,将ServiceConnection传入。于是您可以很轻松的从它的回调中拿到那个已经被处理好的,您在自定义Service onBind()绑定的自定义IBinder。
- 接着您进程A里,就可以像平常调用方法那样使用这个Binder。 Binder于用户而言最大的意义就是,像调用普通代码那样跨进程。方便高效。
如果IBinder脱离Service使用呢?那是不可行的, 因为您没有新进程, 底层Binder驱动根本不知道您调用的相关方法信息应该传至哪个进程,从而出现问题。
Binder驱动使用入门
我先把上述文章的代码给简单的列出来以便于理解:
1. 定义 AIDL 接口
创建 .aidl
文件,声明服务接口:
// IBookManager.aidl
package com.example;、interface IBookMana