轉載自:http://blog.csdn.net/cjjky/article/details/7562652html
=======================================java
在Android中,每一個應用程序都有本身的進程,當須要在不一樣的進程之間傳遞對象時,該如何實現呢?顯然,Java中是不支持跨進程內存共享的,所以要傳遞對象,須要把對象解析成操做系統可以理解的數據格式,以達到跨界對象訪問的目的。在Android中,則採用AIDL(Android Interface Definition Language :接口定義語言)方式實現。android
AIDL (Android Interface Definition Language)是一種IDL 語言,用於生成能夠在Android設備上兩個進程之間進行進程間通訊(IPC)的代碼。若是在一個進程中(例如Activity)要調用另外一個進程中(例如Service)對象的操做,就能夠使用AIDL生成可序列化的參數。編程
AIDL IPC機制是面向接口的,它是使用代理類在客戶端和實現端傳遞數據。設計模式
使用AIDL實現IPCapp
使用AIDL實現IPC服務的步驟是:編程語言
1. 建立.aidl文件-該文件(YourInterface.aidl)定義了客戶端可用的方法和數據的接口。ide
2. 在makefile文件中加入.aidl文件-(Eclipse中的ADT插件提供管理功能)Android包括名爲AIDL的編譯器,位於tools/文件夾。佈局
3. 實現接口-AIDL編譯器從AIDL接口文件中利用Java語言建立接口,該接口有一個繼承的命名爲Stub的內部抽象類(而且實現了一些IPC調用的附加方法),要作的就是建立一個繼承於YourInterface.Stub的類而且實如今.aidl文件中聲明的方法。this
4. 向客戶端公開接口-若是是編寫服務,應該繼承Service而且重載Service.onBind(Intent) 以返回實現了接口的對象實例
建立.aidl文件
AIDL使用簡單的語法來聲明接口,描述其方法以及方法的參數和返回值。這些參數和返回值能夠是任何類型,甚至是其餘AIDL生成的接口。重要的是必須導入全部非內置類型,哪怕是這些類型是在與接口相同的包中。下面是AIDL能支持的數據類型:
1.Java編程語言的主要類型 (int, boolean等) — 不須要 import 語句。
2.如下的類 (不須要import 語句):
String
List -列表中的全部元素必須是在此列出的類型,包括其餘AIDL生成的接口和可打包類型。List能夠像通常的類(例如List<String>)那樣使用,另外一邊接收的具體類通常是一個ArrayList,這些方法會使用List接口。
Map - Map中的全部元素必須是在此列出的類型,包括其餘AIDL生成的接口和可打包類型。通常的maps(例如Map<String,Integer>)不被支持,另外一邊接收的具體類通常是一個HashMap,這些方法會使用Map接口。
CharSequence -該類是被TextView和其餘控件對象使用的字符序列。
3.一般引引用方式傳遞的其餘AIDL生成的接口,必需要import 語句聲明
4.實現了Parcelable protocol 以及按值傳遞的自定義類,必需要import 語句聲明。
經過對上面的基本瞭解,下面我就以一個具體的實例來講明Android中如何經過AIDL機制來實現兩個進程中實現通信:(情景假設:例如A應用經過服務Service方式向B應用提供經過書籍編號來查詢書籍名稱的服務)
A應用程序結構圖以下:
經過上面的結構圖能夠看到,在A應用程序中建立一個 aidl 的接口,而後系統在 gen 目錄下自動生成相應的 java 文件。
其中 IBook.aidl 文件的源碼:
其中 BookService.java 類中的源碼以下:
同時別忘了在 Manifest.xml中配置該服務對象(標紅色的部分),建議採用隱式方式激活該服務,適合不一樣的進程的意圖。
以上咱們已經實現了A應用程序提供服務的功能,下面咱們來實現B應用(或者其它須要用到A應用提供服務的應用程序)
B應用程序結構圖以下:
咱們看到B應用程序也要和服務端一樣的 .aidl 文件,咱們能夠從A應用程序中把該 aidl 文件中拷貝過來就是了,呵。因爲B應用中 .aidl 文件和 A應用中的 .aidl 文件源碼同樣,我在這裏就不列出來了。
其中AIDLClientDemoActivity.java源碼以下:【注:其中該客戶端類要經過 bindService 方式來啓動另一個進程的服務,這樣才能實現和服務進行交互。若是經過startService方式來啓動服務,則不能與服務進行交互】
其中界面佈局文件 main.xml 源碼:
至此,咱們已經完成了B應用程序的代碼實現部分,咱們要先把A應用程序部署到機器上,而後咱們再運行B應用程序。下面咱們經過截圖來看下程序運行的結果:
經過上面的截圖,咱們輸入書籍編號 1,就能夠查詢出相應的書籍名稱,到此,咱們就能夠了解了 Android應用中如何經過AIDL機制實現兩個進程的通信。
注:本文爲 Andy.Chen 原創,歡迎你們轉載,轉載請你們註明出處,謝謝。