原文首發(fā)于微信公眾號:jzman-blog
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,徐州企業(yè)網(wǎng)站建設,徐州品牌網(wǎng)站建設,網(wǎng)站定制,徐州網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,徐州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
上篇文章 中主要介紹從 AIDL 的使用方式以及 Android 開發(fā)中不同進程之間的通信,遺留的問題是如何在 AIDL 中使用自定義類型,具體步驟如下:
自定義類型傳輸?shù)木褪且粋€實體對象,這個實體類必須實現(xiàn) Parcelable 接口,具體如下:
// 自定義類型
public class Work implements Parcelable {
private String title;
private String content;
// getter、setter、Parcelable 省略
}
創(chuàng)建一個 .aidl 文件聲明剛才定義的類型,注意與具體業(yè)務 .aidl 文件的不同,聲明具體如下:
// 在.aidl文件中聲明自定義類型
package com.manu.aidldemo;
parcelable Work;
在定義具體業(yè)務的 .aidl 文件中定義與自定義類型相關的業(yè)務,具體如下:
// Declare any non-default types here with import statements
import com.manu.aidldemo.Work; //注意
interface IPersonAidlInterface {
//定義與自定義類型相關的業(yè)務
Work getWorkInfo();
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
注意:導入自定義類型,否則不識別。
由于新增了具體業(yè)務,也就是 getWorkInfo() ,需要具體業(yè)務類里面實現(xiàn)具體的業(yè)務,具體如下:
//新增自定義類型相關的業(yè)務
@Override
public Work getWorkInfo() throws RemoteException {
Work work = new Work();
work.setTitle("學習AIDL");
work.setContent("Android developer");
return work;
}
綁定 Service 成功之后會得到 IBinder 對象,然后通過 asInterface() 獲取到 IPersonAidlInterface 對象就可以調(diào)用了,具體如下:
public void callRemoteClick(View view) {
Log.i(TAG,"遠程調(diào)用具體服務...");
try {
//遠程調(diào)用
Work work = iPersonAidlInterface.getWorkInfo();
System.out.println("這是遠程調(diào)用的服務信息:title="+work.getTitle()+",content="+work.getContent());
} catch (RemoteException e) {
e.printStackTrace();
}
}
日志運行截圖如下:
使用流程實際上在上篇文章中已經(jīng)闡述清楚了,這篇貌似有點多余,不過算是對過去知識的總結(jié)吧!