AIDL的使用步驟

文章轉(zhuǎn)載于:https://www.cnblogs.com/chase1/p/7135961.html

aidl遠(yuǎn)程調(diào)用傳遞的參數(shù)和返回值支持Java的基本類型(int long booen char byte等)和String,List,Map等孕似。當(dāng)然也支持一個(gè)自定義對(duì)象的傳遞仙蛉。

服務(wù)端

1新建一個(gè)MyAidlDemoServer工程盒使,然后在java目錄下右鍵新建一個(gè)aidl File捣作,然后在該目錄下新建一個(gè)IMyAidlInterface.aidl文件衣摩,代碼如下:


修改生成的.aidl文件中的內(nèi)容

1interface IMyAidlInterface {23intadd(intarg1,int arg2);45}//aidl文件里面的代碼不需要加任何修飾符


這里定義了一個(gè)IMyAidlInterface接口,里面定義的add方法用于求和計(jì)算卜录。

然后Build當(dāng)前工程(Build選項(xiàng)里的Make Project)戈擒。

會(huì)發(fā)現(xiàn)在app/build/generated/source/aidl/debug目錄下會(huì)生成一個(gè)與IMyAidlInterface.aidl文件同樣包名的一個(gè)文件,該文件下面自動(dòng)生成IMyAidlInterface文件艰毒,該文件里面自動(dòng)實(shí)現(xiàn)了一些方法用于遠(yuǎn)程調(diào)用筐高。

編寫遠(yuǎn)程服務(wù)

1新建MyService類繼承Service,并實(shí)現(xiàn)以下代碼丑瞧。

1publicclass MyService extends Service { 2IMyAidlInterface.Stub mStub =new IMyAidlInterface.Stub() { 3? ? ? ? @Override 4publicintadd(intarg1,int arg2) throws RemoteException { 5returnarg1 + arg2; 6? ? ? ? } 7? ? }; 8 9? ? @Override10public IBinder onBind(Intent intent) {11return mStub;12? ? }13}

服務(wù)里的代碼重寫了IMyAidlInterface.Stub類中的 add方法柑土,然后通過(guò)重寫onBind()方法將重寫的IMyAidlInterface.Stub類返回出去。


然后在AndroidManifest.xml對(duì)Service進(jìn)行配置绊汹。

16789

這里設(shè)置了android:process屬性稽屏,并且設(shè)置為":remote"。

android:process=":remote"西乖,代表在應(yīng)用程序里狐榔,當(dāng)需要該service時(shí),會(huì)自動(dòng)創(chuàng)建新的進(jìn)程获雕。而如果是android:process="remote"薄腻,沒(méi)有“:”分號(hào)的,則創(chuàng)建全局進(jìn)程典鸡,不同的應(yīng)用程序共享該進(jìn)程被廓。

然后添加了一個(gè)意圖過(guò)濾器。

客戶端

新建MyAidlDemoCustomer工程萝玷,然后直接把服務(wù)端的aidl目錄直接拷貝到客戶端的main目錄下嫁乘。這么一來(lái)客戶端的aidl就無(wú)需編寫了,直接和服務(wù)端的一模一樣球碉。包括路徑的包名等蜓斧。 當(dāng)然也可以在客戶端這邊重新寫aidl文件。

編輯布局文件:

1 2 5 611

這里只用了一個(gè)TextView來(lái)顯示最終的計(jì)算結(jié)果睁冬。

然后編輯客戶端的調(diào)用代碼:

1publicclass MainActivity extends AppCompatActivity { 2 3? ? ? ? TextView tv; 4? ? ? ? IMyAidlInterface mStub; 5 6? ? ? ? @Override 7protectedvoid onCreate(Bundle savedInstanceState) { 8? ? ? ? ? ? super.onCreate(savedInstanceState); 9? ? ? ? ? ? setContentView(R.layout.activity_main);1011tv = (TextView)findViewById(R.id.tv);1213Intent intent =new Intent();14//由于是隱式啟動(dòng)Service 所以要添加對(duì)應(yīng)的action挎春,A和之前服務(wù)端的一樣看疙。15intent.setAction("co.example.leo.myService");16//android 5.0以后直設(shè)置action不能啟動(dòng)相應(yīng)的服務(wù),需要設(shè)置packageName或者Component直奋。17intent.setPackage("co.example.leo.myaidldemoserver");//packageName 需要和服務(wù)端的一致.18? ? ? ? ? ? bindService(intent,serviceConnection,BIND_AUTO_CREATE);19? ? ? ? }2021privateServiceConnection serviceConnection =new ServiceConnection() {22? ? ? ? ? ? @Override23publicvoid onServiceConnected(ComponentName name, IBinder service) {24//調(diào)用asInterface()方法獲得IMyAidlInterface實(shí)例25mStub = IMyAidlInterface.Stub.asInterface(service);26if(mStub ==null) {27Log.e("MainActivity","the mStub is null");28}else{//當(dāng)mStub不為空就調(diào)用其add方法進(jìn)行計(jì)算能庆,并顯示到TextView上面。29try {30intvalue = mStub.add(1,8);31tv.setText(value +"");32}catch (RemoteException e) {33? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();34? ? ? ? ? ? ? ? ? ? }35? ? ? ? ? ? ? ? }36? ? ? ? ? ? }3738? ? ? ? ? ? @Override39publicvoid onServiceDisconnected(ComponentName name) {4041? ? ? ? ? ? }42? ? ? ? };434445? ? ? ? @Override46protectedvoid onDestroy(){47//解綁服務(wù) 48? ? ? ? ? ? super.onDestroy();49? ? ? ? ? ? unbindService(serviceConnection);50? ? ? ? }51}

最后安裝上客戶端和服務(wù)端脚线,打開(kāi)客戶端后會(huì)發(fā)現(xiàn)已經(jīng)調(diào)用了服務(wù)端的方法并計(jì)算出了結(jié)果搁胆。

總結(jié)

這是一個(gè)在AS下最簡(jiǎn)單的一個(gè)AIDL編程:

1.服務(wù)端創(chuàng)建一個(gè)aidl目錄,然后在該目錄下新建一個(gè).aidl為后綴的接口類邮绿,該類定義遠(yuǎn)程調(diào)用的接口方法渠旁。

2.build編譯之后會(huì)在app/build/generated/source/aidl/debug目錄下會(huì)生成aidl遠(yuǎn)程實(shí)現(xiàn)類,該類是AS自動(dòng)生成的船逮。

3.在AndroidManifest.xml下配置Service的action和process屬性顾腊。

4.將服務(wù)端的aidl目錄拷貝到客戶端相應(yīng)的目錄下,然后編寫客戶端調(diào)用代碼挖胃,AS下簡(jiǎn)單的aidl編程就ok了杂靶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冠骄,隨后出現(xiàn)的幾起案子伪煤,更是在濱河造成了極大的恐慌,老刑警劉巖凛辣,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抱既,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扁誓,警方通過(guò)查閱死者的電腦和手機(jī)防泵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝗敢,“玉大人捷泞,你說(shuō)我怎么就攤上這事∈偾矗” “怎么了锁右?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讶泰。 經(jīng)常有香客問(wèn)我咏瑟,道長(zhǎng),這世上最難降的妖魔是什么痪署? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任码泞,我火速辦了婚禮,結(jié)果婚禮上狼犯,老公的妹妹穿的比我還像新娘余寥。我一直安慰自己领铐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布宋舷。 她就那樣靜靜地躺著绪撵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祝蝠。 梳的紋絲不亂的頭發(fā)上莲兢,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音续膳,去河邊找鬼。 笑死收班,一個(gè)胖子當(dāng)著我的面吹牛坟岔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摔桦,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼社付,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了邻耕?” 一聲冷哼從身側(cè)響起鸥咖,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兄世,沒(méi)想到半個(gè)月后啼辣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡御滩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鸥拧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片削解。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡富弦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氛驮,到底是詐尸還是另有隱情腕柜,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布矫废,位于F島的核電站盏缤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏磷脯。R本人自食惡果不足惜蛾找,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赵誓。 院中可真熱鬧打毛,春花似錦柿赊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至熬甫,卻和暖如春胰挑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椿肩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瞻颂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郑象。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓贡这,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親厂榛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盖矫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355