文章轉(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了杂靶。