Android入门:通过AIDL进行进程间通信

来源:互联网 发布:深圳软件外包公司排名 编辑:程序博客网 时间:2024/05/18 22:52

一、AIDL介绍


AIDL:Android Interface Definition Language,接口定义语言;顾名思义,就是定义接口的语言,即利用AIDL可以定义接口;

AIDL简单地说就是进程间通信的方法,类似于Java中的RMI;

AIDL利用Xxx.aidl文件定义接口,通常将此文件放在com.xiazdong.aidl中;

AIDL文件的编写类似于接口的编写,但有一些不同:

(1)AIDL中的接口和方法前不能加上任何访问权限修饰符(如public、private、static、final);
(2)AIDL支持Java基本类型
(3)AIDL中的方法参数如果是非Java基本类型,则要加上in、out、inout;
(4)AIDL对于自定义类型,则需要实现Parselable接口;

AIDL编写后会在gen目录中自动生成java文件;

在自动生成的文件中我们需要了解的方法有:
(1)Xxx xx = Xxx.stub.asInterface(IBinder);//将IBinder类型转换成AIDL类型,在ServiceConnection的onServiceConnected中使用;
(2)Xxx.stub.fun();//调用aidl定义的方法


需要注意的是,由于AIDL文件是两应用通信的桥梁,因此此文件在两应用中都要存在;



二、代码案例



场景说明:此场景和“Android入门:绑定本地服务”文章中的应用功能一样,不同的是加法的服务在AIDLService应用,而调用加法的程序在AIDLClient应用中;

效果和以前一样:




程序组织结构的不同:




AIDLClient代码


AddOp.aidl
[html] view plaincopy
  1. package com.xiazdong.aidl;  
  2.   
  3. interface AddOp {   //除了没有访问权限,其他和接口定义差不多  
  4.     int addService(int a,int b);  
  5. }  

MainActivity.java

[java] view plaincopy
  1. package com.xiazdong.aidlclient;  
  2.   
  3.   
  4. import com.xiazdong.aidl.AddOp;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.ComponentName;  
  8. import android.content.Intent;  
  9. import android.content.ServiceConnection;  
  10. import android.os.Bundle;  
  11. import android.os.IBinder;  
  12. import android.os.RemoteException;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.EditText;  
  17. import android.widget.TextView;  
  18.   
  19. public class MainActivity extends Activity {  
  20.     private EditText op1,op2;  
  21.     private Button button;  
  22.     private TextView result;  
  23.     private AddOp binder ;  
  24.     private ServiceConnection conn = new AddOpServiceConnection();  
  25.     private OnClickListener listener = new OnClickListener(){  
  26.         @Override  
  27.         public void onClick(View v) {  
  28.             int number = 0;  
  29.             try {  
  30.                 number = binder.addService(Integer.parseInt(op1.getText().toString()), Integer.parseInt(op2.getText().toString()));  
  31.             } catch (Exception e) {  
  32.                 e.printStackTrace();  
  33.             }  
  34.             result.setText("result="+number+"");  
  35.         }  
  36.     };  
  37.     @Override  
  38.     public void onCreate(Bundle savedInstanceState) {  
  39.         super.onCreate(savedInstanceState);  
  40.         setContentView(R.layout.main);  
  41.         op1 = (EditText)this.findViewById(R.id.op1);  
  42.         op2 = (EditText)this.findViewById(R.id.op2);  
  43.         result = (TextView)this.findViewById(R.id.result);  
  44.         button = (Button)this.findViewById(R.id.button);  
  45.         button.setOnClickListener(listener);  
  46.         Intent service = new Intent("com.xiazdong.action"); //隐式意图  
  47.         this.bindService(service, conn, BIND_AUTO_CREATE);  
  48.     }  
  49.     private class AddOpServiceConnection implements ServiceConnection{  
  50.         @Override  
  51.         public void onServiceConnected(ComponentName name, IBinder service) {  
  52.              binder = AddOp.Stub.asInterface(service);  //将IBinder转换成接口类型  
  53.         }  
  54.         @Override  
  55.         public void onServiceDisconnected(ComponentName name) {  
  56.             binder = null;  
  57.         }  
  58.     }  
  59. }  


AIDLService代码


AddOp.aidl

[java] view plaincopy
  1. package com.xiazdong.aidl;  
  2.   
  3. interface AddOp {  
  4.     int addService(int a,int b);  
  5. }  


AddOpService.java

[java] view plaincopy
  1. package com.xiazdong.aidlservice;  
  2.   
  3. import com.xiazdong.aidl.AddOp;  
  4. import android.app.Service;  
  5. import android.content.Intent;  
  6. import android.os.IBinder;  
  7. import android.os.RemoteException;  
  8.   
  9. public class AddOpService extends Service {  
  10.     private IBinder binder = new AddOpBinder();  
  11.     @Override  
  12.     public IBinder onBind(Intent intent) {  
  13.         return binder;  
  14.     }  
  15.     public int add(int a,int b){//服务提供的方法通过Binder对象提供给外部  
  16.         return a+b;  
  17.     }  
  18.     private class AddOpBinder extends AddOp.Stub{   //继承aidl生成的存根  
  19.         @Override  
  20.         public int addService(int a, int b) throws RemoteException {    //实现此方法  
  21.             return add(a,b);    //调用服务的方法  
  22.         }  
  23.     }  
  24. }  
0 0