国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

Android:Service之AIDL傳遞系統基本類型數!據

2019-11-02 15:09:08
字體:
來源:轉載
供稿:網友

   什么是AIDL?

  先來回顧一下,Android在本地的Service中如何與其它組件進行交互的,首先Service必須實現其onBind()方法,然后在onBind方法傳遞一個IBinder接口的實現,而在其它組件中使用bindService()綁定一個服務,再通過其中的參數ServiceConnection對象獲取到Service中定義的IBinder接口的實現。那么與Service進行數據交互,其實就是傳遞一個IBinder,通過這個IBinder進行交互。

  而現在就碰到一個問題,在同一個進程中,是可以獲取到這個Service類的,也就可以獲得這個Service中定義的IBinder,但是如果在不同的應用中,即遠程服務,如何獲取IBinder呢?僅僅是在不同的應用定義一相同的類是沒有用的,所以Android為我們提供了AIDL語言,它需要先定義一個遠程調用接口,然后為該接口提供一個實現類,通過共享這個遠程調用接口來達到進程間數據交互的目的,而這個接口的代碼是有很多共性的,并且編寫過程相當枯燥乏味,所以Android開發者為我們提供了ADIL來簡化通訊接口的開發。

  AIDL(Android Interface Definition Language)是Android遠程調用接口的定義語言。它有它自己的一套語法規范,但是和Java類似,這并不難理解,詳細的這個會后面介紹。而當你定義好一個AIDL接口之后,你會發現在gen/目錄下,多出一個與定義的AIDL包名相同,文件名相同的一個Java類,這個類是編譯器根據定義的AIDL接口自動生成的代碼,觀察之后發現其實它也是繼承了Binder類(Binder是IBinder的實現類),所以它可以通過ServiceConnection進行數據傳遞。Service只需要暴露這個AIDL接口給客戶端,讓客戶端也定義它,這樣兩個應用進程就可以通訊了。

  如何定義AIDL?

  AIDL的語法與Java接口的語法非常相似,但是存在一些差異:

  AIDL定義接口的源代碼后綴必須以.aidl結尾。

  AIDL一樣要指定AIDL接口的包信息package *。

  AIDL接口無需指定public、private、protected等作用域,可以理解為就是public。

  AIDL默認情況下只能傳遞基本類型、String、List、Map、CharSequence。

  如果需要傳遞其他類型的對象,需要import對象的包名,并需要對對象進行特殊處理(之后會介紹)。

  例如:

  1 package com.example.aidlservicedemo.domain;

  2

  3 interface IDog{

  4 String getName();

  5 int getAge();

  6 }

  ADIL做了什么?

  當你聲明完一個AIDL接口的時候,你會發現在項目的gen/目錄下,對應包中存在一個同名的Java文件,這個文件是Android幫我們自動生成的,里面有很多代碼,這里只講一下需要注意的。查看自動生成的這個Java文件代碼,會發現它定義了一個名為Stub的靜態抽象類,這個Stub繼承了Binder,實現了AIDL接口,當然其中也實現了AIDL接口的兩個方法,粗略看一下會發現它對數據做了一個序列化和反序列化的操作。正因為AIDL對數據進行了序列化和反序列化,所以才可以在進程間傳遞。

  使用ADIL傳遞系統基本數據

  定義好AIDL接口之后,就需要通過服務把接口暴露給客戶端,這里Service.onBind()傳遞的就是這個Stub靜態抽象類的實現類,其他沒什么特別的。

  下面通過一個Demo來演示ADIL如何傳遞數據的,在示例中,給出兩個應用,分別實現Server與調用客戶端,使用的AIDL接口就是上面給出的AIDL示例代碼,這里不再重復定義。

  AIDL服務:BaseTypeService.java

  1 package com.example.aidlservicedemo;

  2

  3 import java.util.Random;

  4

  5 import com.example.aidlservicedemo.domain.IDog.Stub;

  6

  7 import android.app.Service;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临潭县| 英吉沙县| 封丘县| 海伦市| 渭南市| 连城县| 育儿| 酉阳| 成安县| 临安市| 滨海县| 潞城市| 罗源县| 定州市| 馆陶县| 吐鲁番市| 北流市| 海盐县| 巴林右旗| 平谷区| 苍溪县| 临清市| 耿马| 慈利县| 宁波市| 五河县| 博罗县| 莱州市| 电白县| 朝阳区| 独山县| 澄迈县| 聂荣县| 曲阜市| 通许县| 广饶县| 辽阳市| 兴安县| 焉耆| 宁陕县| 抚州市|