日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android-使用AIDL进程间通信

發布時間:2024/9/27 Android 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android-使用AIDL进程间通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于客戶端和服務之間通信,雖然可以通過Ibinder實現,但需要共享業務實現,如果在進程間通信的haunted,需要使用AIDL(Android Interface Definition Language)進行。

?

AIDL是一種接口定義語言,用于約束兩個進程間的通訊規則,編譯器生成代碼,實現Android設備上的兩個進程間通信(IPC,AIDLIPC機制和EJB所采用的CORBA很類似,進程之間的通信信息,首先會被轉換成AIDL協議消息,然后發送給對方,對方收到AIDL協議消息后在轉換成相應的對象。由于進程之間的通信信息需要雙向轉換,所以android采用代理類背后實現了信息的雙向轉換,代理類由android編譯器生成,對開發人員來說是透明的。

?

使用方式如下:

1、? 定義AIDL(同接口相似,但沒有可見性,擴展名有.java—>.aidl

//IdownloadService.aidl,注意擴展名

package cn.itcast.aidl;

interface IdownloadService{

???????? void download(in/out/input String path);//in|out|inout是參數的方向。

}

Ide會自動在gen包下生成對應的java類,接口文件中生成一個stub的抽象類,里面包括aidl定義的方法,還包括一些其它輔助方法。值得關注的是asInterface(IBinder iBinder),它返回接口類型的實例,對于遠程服務調用,遠程服務返回給客戶端的對象,客戶端onServiceConnectionted(ComponentName name,IBinder service)方法引用該對象時不能直接強轉成接口類型的實例,而應該使用asInterface(IBinder iBinder)進行類型轉換。

?

編寫AIDL需要注意:

1.?????? 接口名和aidl文件相同。

2.?????? 接口和方法前不用加訪問權限修飾符public,private,protected等,也不能用final,static.

3.?????? Aidl默認支持的類型包括java基本類型(int,long,boolean)(String,List,Map,CharSequence),使用這些類型是不需要import聲明,對于ListMap中的元素類型必須是Aidl支持的類型,如果用自定義類型作為參數或返回值,自定義類型必須實現Parcelable接口。

4.?????? 自定義類型的AIDL生成的其它接口類型在aidl描述文件中,應該顯示import,即便在該類型和定義的包同一個包中。

5.?????? aidl文件中所有非Java基本類型參數必須加上inoutinout標記,以指明參數是輸入參數,輸出參數還是輸入輸出參數。

6.Java原始類型默認的標記位in,不能為其它標記。

?

Javabean必須實現Parcelable接口

class Person implements Parcelable{

???????? id,name;

???????? public int describeContents(){

?????????????????? return 0;

}

//javabean中的數據寫到Parcel

public void writeToParcel(Parcel dest,int flags){

???????? dest.writeInt(this.id);

dest.writeString(this.name);

}

?

//添加一個靜態成員,名為CREATOR,該對象實現了Parcelable.Creator接口

? public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){

?????????????????? public Person createFromParcel(Parcel source) {????????????????????? ?? return new Person(source.readInt(), source.readString());

?????????????????? }

?????????????????? public Person[] newArray(int size) {

?????????????????? ?? return new Person[size];

?????????????????? }};

}

?

在自定義類型包中定義aidl聲明文件

//Person.aidl,注意Parcelable是小寫

Package cn.itcast.domain;

parcelable Person;

interface cn.itcast.domain.Person;

interface IPersonService{

???????? void save(in Person person);

}

?

創建aidl接口實現類(通過繼承${業務接口}.stub類實現)

Public class ServiceBinder extends IPersonService.Stub{

???????? Public void save(Person person) throws RemoteException{

?????????????????? Log.i(“PersonService”,person.getId()+”=”+person.getName());

}

}

?

實現serviceonBind方法,返回值就是上一步創建的aidl實現類對象。

public IBinder onBind(Intent intent){

???????? return new ServiceBinder();

}

?

客戶端通過隱式意圖訪問服務。

<service android:name=”.PersonService”>

???????? <intent-filter>

?????????????????? <action android:name=”cn.itcast.process.aidl.PersonService”/>

new Intent(“cn.itcast.process.aidl.PersonService”);

?

復制aidl文件和所在包到客戶端對應的src下。(客戶端會自動生成對應java)

this.bindService(,this.sc,BIND_AUTO_CREATE);

sc = new ServiceConnection(){

???????? public void onServiceConnected(ComponentName,IBinder service){

?????????????????? personService = IPersonService.Stub.asInterface(service);

?????????????????? personService.save(new Person(56,”liming”));

}

?

public void onServiceDisconnected(ComponetName name){

???????? personService = null;

}

}

?

Android-結束通話

Android沒有對外公開通話的API,如果需要結束通話,必須使用AIDL于電話管理服務進行通行,并調用服務中的API實現結束通話,方法如下:

1.?????? Android的源代碼中拷貝以下文件到項目中:

com/android/internal/telephony/ITelephony.aidl

android/telephony/NeighboringCellInfo.aidl

???????? 如右圖所示。開發工具會在gen目錄下自動生成ITelephony.java

?

2.?????? 調用ITelephony.endCall()結束通話:

Method method = Class.forName(“android.os.ServiceManager”)

.getMethod(“getService”,String.class);

IBinder binder = (IBinder)method.invoke(null,new Object[]{TELEPHONY_SERVICE});

ITelephony telephony = ITelephony.Stub.asInterface(binder);

Telephony.endCall();

?

在清單文件AndroidManifest.xml中添加權限

<uses-permission android:name=”android.permission.CALL_PHONE”/>

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的Android-使用AIDL进程间通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品无码久久久久高潮 | 欧美999 | 在线看b | 精品国产99久久久久久宅男i | 生活片一级片 | 夜夜躁很很躁日日躁麻豆 | 中文字幕不卡 | 久久视频中文字幕 | 久草视频国产 | 超碰人人人人 | 国产精品毛片久久久久久久 | 呦呦视频在线观看 | 成人深夜影院 | 亚洲在线免费观看视频 | xxxxx黄色| 精品毛片在线观看 | 男人网站在线观看 | 久久久久中文 | 久草精品在线观看 | 国产美女久久久久久 | 国产素人在线 | av在哪里看 | 日韩a毛片 | 精品少妇一区二区三区免费观 | 亚洲精品www久久久久久 | 人妻色综合网站 | 免费在线精品视频 | 色操插 | 总裁边开会边做小娇妻h | 久久久欧美 | 国产真实乱人偷精品人妻 | 精品理论片 | 黄色一级视频在线观看 | 久久艹精品视频 | 一区二区视频播放 | 亚洲成人麻豆 | 91在线精品入口 | 国产免费av一区二区 | 日韩精品h | 神马久久影院 | 级毛片| 欧美一区二区三区在线视频 | 美女国产在线 | 欧美aⅴ| 四虎视频国产精品免费 | 亚洲国产精品毛片av不卡在线 | 激情午夜天 | 怡春院在线视频 | 亚洲成人av一区二区三区 | 美女扒开粉嫩的尿囗给男生桶 | 美女天天操| 亚洲天堂一区二区三区四区 | 成熟女人毛片www免费版在线 | 法国空姐电影在线观看 | 蜜臀av性久久久久av蜜臀妖精 | 91国偷自产一区二区三区女王 | 亚洲av熟女高潮一区二区 | 日韩欧美中字 | 日韩深夜视频 | 18禁网站免费无遮挡无码中文 | 自拍偷拍校园春色 | 99久久婷婷国产一区二区三区 | 有码av在线| 欧美影院在线 | 少妇又紧又色又爽又刺激 | 久久亚洲欧美 | 欧美日韩免费网站 | 韩日产理伦片在线观看 | 精品国产二区三区 | av大片网址 | 免费成人在线观看视频 | 久久精品福利 | 中文字幕69 | 国产欧美一区二区三区另类精品 | 亚洲国产日韩在线观看 | 成人在线免费视频 | www视频在线观看免费 | 欧美伦理影院 | www色网站 | 好色艳妇小说 | 国产福利在线 | 黄网www| 免费观看一级一片 | 日韩黄色av | 成人做受视频试看60秒 | 午夜黄色福利 | 夜夜久久 | 国产视频导航 | 色一情一乱一乱一区91av | 女教师高潮黄又色视频 | 欧美日韩大片在线观看 | www色天使| 琪琪色在线视频 | 熟女高潮一区二区三区视频 | 精品少妇一区二区三区 | 真实人妻互换毛片视频 | 熟女肥臀白浆大屁股一区二区 | 成年人网站免费看 | 国产精品亚洲一区二区无码 |