水一篇以前寫的文章??
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