首页 > 代码库 > 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.显示结果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。