首页 > 代码库 > Android技术22:Android中AIDL

Android技术22:Android中AIDL

     在Android中进程内部通过全局变量,文件,preference,数据库作为数据的载体实现数据共享和通信。然后在进程之间则需要借助Binder实现IPC调用。Android进程通信框架:服务端,客户端,Linux binder驱动。Binder驱动成为连接两端的桥梁。我们首先通过aidl语言实现一个简单的多进程通信。具体实现步骤如下:

1.定义aidl文件

IService.aidl,定义一个接口,test() ,不包含负责的类和数据。

1 package com.demo.ipc;2 3 interface IService{4     void test();5 }

2.在gen目录下自动生成响应java文件,其主要类下生成一个Stub,该类为抽象类,继承了IBinder类,主要作为服务端,用于接收服务请求,与客户端打交道。

 1 /* 2  * This file is auto-generated.  DO NOT MODIFY. 3  * Original file: D:\\Android\\ipc\\src\\com\\demo\\ipc\\IService.aidl 4  */ 5 package com.demo.ipc; 6 public interface IService extends android.os.IInterface 7 { 8 /** Local-side IPC implementation stub class. */ 9 public static abstract class Stub extends android.os.Binder implements com.demo.ipc.IService10 {11 private static final java.lang.String DESCRIPTOR = "com.demo.ipc.IService";12 /** Construct the stub at attach it to the interface. */13 public Stub()14 {15 this.attachInterface(this, DESCRIPTOR);16 }17 /**18  * Cast an IBinder object into an com.demo.ipc.IService interface,19  * generating a proxy if needed.20  */21 public static com.demo.ipc.IService asInterface(android.os.IBinder obj)22 {23 if ((obj==null)) {24 return null;25 }26 android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);27 if (((iin!=null)&&(iin instanceof com.demo.ipc.IService))) {28 return ((com.demo.ipc.IService)iin);29 }30 return new com.demo.ipc.IService.Stub.Proxy(obj);31 }32 @Override public android.os.IBinder asBinder()33 {34 return this;35 }36 @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException37 {38 switch (code)39 {40 case INTERFACE_TRANSACTION:41 {42 reply.writeString(DESCRIPTOR);43 return true;44 }45 case TRANSACTION_test:46 {47 data.enforceInterface(DESCRIPTOR);48 this.test();49 reply.writeNoException();50 return true;51 }52 }53 return super.onTransact(code, data, reply, flags);54 }55 private static class Proxy implements com.demo.ipc.IService56 {57 private android.os.IBinder mRemote;58 Proxy(android.os.IBinder remote)59 {60 mRemote = remote;61 }62 @Override public android.os.IBinder asBinder()63 {64 return mRemote;65 }66 public java.lang.String getInterfaceDescriptor()67 {68 return DESCRIPTOR;69 }70 @Override public void test() throws android.os.RemoteException71 {72 android.os.Parcel _data =http://www.mamicode.com/ android.os.Parcel.obtain();73 android.os.Parcel _reply = android.os.Parcel.obtain();74 try {75 _data.writeInterfaceToken(DESCRIPTOR);76 mRemote.transact(Stub.TRANSACTION_test, _data, _reply, 0);77 _reply.readException();78 }79 finally {80 _reply.recycle();81 _data.recycle();82 }83 }84 }85 static final int TRANSACTION_test = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);86 }87 public void test() throws android.os.RemoteException;88 }

3.创建服务端RemoteService

重写onBind()方法。

 1 public class RemoteService extends Service { 2  3     @Override 4     public IBinder onBind(Intent intent) { 5         return mBinder; 6     } 7      8     IService.Stub mBinder=new Stub() { 9         10         @Override11         public void test() throws RemoteException {12             Log.i("tag", "RemoteService--mBinder--add");13             14         }15     };16 17 }

5.AndroidManifest.xml注册声明Service

1     <service android:name="com.demo.ipc.RemoteService" android:process=":remote">2             <intent-filter>3                 <action android:name="com.demo.ipc.RemoteService"/>4             </intent-filter>5         </service>

6.定义客户端

 1 package com.demo.ipc; 2  3 import android.content.ComponentName; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.content.ServiceConnection; 7 import android.os.Bundle; 8 import android.os.IBinder; 9 import android.os.RemoteException;10 import android.support.v7.app.ActionBarActivity;11 import android.util.Log;12 import android.view.View;13 import android.view.View.OnClickListener;14 import android.widget.Button;15 16 public class MainActivity extends ActionBarActivity {17 18     private Button bt1,bt2;19     private IService mService;20     private boolean isOpen=false;21     private ServiceConnection serviceConnection=new ServiceConnection() {22         23         @Override24         public void onServiceDisconnected(ComponentName name) {25             Log.i("tag", "MainActivity--ServiceConnextion--onServiceDisconnected");26             mService=null;27         }28         29         @Override30         public void onServiceConnected(ComponentName name, IBinder service) {31             Log.i("tag", "MainActivity--ServiceConnextion--onServiceConnected");32             mService=IService.Stub.asInterface(service);33         }34     };35     @Override36     protected void onCreate(Bundle savedInstanceState) {37         super.onCreate(savedInstanceState);38         setContentView(R.layout.activity_main);39         bt1=(Button) findViewById(R.id.bt1);40         bt2=(Button) findViewById(R.id.bt2);41         bt1.setOnClickListener(new OnClickListener() {42             43             @Override44             public void onClick(View v) {45                 if(!isOpen){46                     bindService(new Intent("com.demo.ipc.RemoteService"), serviceConnection, Context.BIND_AUTO_CREATE);47                 }else{48                     unbindService(serviceConnection);49                 }50                 51             }52         });53         bt2.setOnClickListener(new OnClickListener() {54             55             @Override56             public void onClick(View v) {57                 try {58                     mService.test();59                 } catch (RemoteException e) {60                     e.printStackTrace();61                 }62                 63             }64         });65     }66     67     68 }

7.显示结果