Android IPC之AIDL

首先說一下Android進程間的集中通訊方式

1.使用Bundle   ----> 用於android四大組件間的進程間通訊
2.使用文件共享  ---->用於單線程讀寫

3.使用Messenger   ---->用於可存放在message中的數據的傳遞java

4.AIDL android 接口定義語言  ---->主要用於調用遠程服務的方法的狀況 還能夠註冊接口 android

 

 

本文大體說一下第四種方式 AIDL,廢話很少說了,直接上代碼git

先看一下host的目錄結構:github

IMyAidlInterface.aidl 是默認新建的AIDL文件,以後我會在裏面增長部分代碼,新建AIDL文件方法以下(切記,新建aidl文件後記得make project一下,as會給咱們默認生成不少aidl對應的java代碼!):數據結構

 

咱們打開IMyAidlInterfacegradle

咱們就以上代碼稍做簡介:spa

1.basciTypes 是建立aidl默認的生成的代碼, 展現給咱們一些默認支持的數據類型線程

2.getName() 返回一個默認支持類型 String,不須要作額外處理3d

3.getPerson() 自定義返回類型blog

若是咱們返回一個基礎類型,不須要作額外的處理,建立目錄結構中的 MyService, 重構其中的方法,getName直接返回一個簡單的String

最後在mainfest 添加service的相關配置:

 

而後咱們新建 client項目,咱們將 host中的aidl文件夾原封不動複製到client ,複製完成client 目錄結構以下:

 

client中直接bind host中的service就能夠調用方法了,下面是 client中的代碼:

 

 點擊按鈕查看效果,成功:

 

 使用自定義數據類型,必須繼承 Parcelable,咱們返回host中查看代碼:

1.新建class Person:

 新建Person.aidl

這樣咱們就能夠在 IMyAidlInterface新建方法getperson訪問該自定義數據結構了(Person 必須手動導入,as不會幫咱們自動導入):

若是想把 gedPerson方法單獨寫在另外一個結構裏,咱們能夠新建一個aidl, IPerson:

 

 最後注意一點坑,咱們必須在host以及client(demo3)的gradle中加入一下配置,不然在AIDL中導入自定義Person的時候會報錯,找不到Person:

 

項目地址: https://github.com/dengshaomin/AndroidDemo.git ,在裏面找AIDL.ZIP

相關文章
相關標籤/搜索