首页 > 程序开发 > 移动开发 > 其他 >

认识AIDL

2017-04-21

认识AIDL,·AIDL,安卓接口定义语言(Android Interface Definition Language),是安卓RPC的解决方案。

【AIDL】

==================================================

@基本概念:

·RPC,远程程序调用(Remote Procedure Call)

·IPC,跨进程通信(Inter Process Communication)

·AIDL,安卓接口定义语言(Android Interface Definition Language),是安卓RPC的解决方案;

----------------------------------------

@AIDL概述:

·AIDL的存在使得APP可以跨进程地绑定和调用其它进程中声明的服务和方法;

·AIDL是安卓IPC的常用手段之一;

·其本质就是跨进程地绑定Service并获取其返回的Binder对象;

----------------------------------------

@服务端开发步骤:

·定义aidl文件(module名称上右键-New-AIDL-AIDL File),声明外部访问接口:

package com.mobiletrain.aidl;

interface IMyAidlInterface {

boolean drink(String what);

}

·rebuild当前模块,生成aidl文件的对应Java接口类(位于模块名\build\generated\source\aidl\debug);

·定义服务,在onBind()方法中返回上述接口实例:

@Override

public IBinder onBind(Intent intent) {

return new MyBinder();

}

class MyBinder extends IMyAidlInterface.Stub {

@Override

public boolean drink(String what) throws RemoteException {

Log.d(TAG, "drink() called with: " + "what = [" + what + "]");

if("jiu".equals(what)){

return true;

}

return false;

}

}

----------------------------------------

@客户端开发步骤:

·定义aidl文件,使之在包名和方法上与服务端公开的包名和方法保持一致(可以拷贝服务端aidl文件的副本)

·rebuild当前模块,生成aidl文件的对应Java接口类(位于模块名\build\generated\source\aidl\debug);

·绑定服务,并在ServiceConnection中获取服务端返回的接口实例:

private IMyAidlInterface iMyAidlInterface;

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder binder) {

iMyAidlInterface = IMyAidlInterface.Stub.asInterface(binder);//获取远程服务返回的AIDL接口类对象

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

};

//绑定远程服务

Intent intent = new Intent();

intent.setComponent(new ComponentName("com.mobiletrain.aidl","com.mobiletrain.aidl.MyService"));

bindService(intent, conn,BIND_AUTO_CREATE);

·调用远程服务的AIDL接口类对象中的方法:

public void remoteDrink(View view) {

if(iMyAidlInterface!=null){

try {

boolean drunk = iMyAidlInterface.drink("jiu");

Toast.makeText(MainActivity.this, "喝醉没?"+drunk, Toast.LENGTH_SHORT).show();

} catch (RemoteException e) {

e.printStackTrace();

}

}

}

相关文章
最新文章
热点推荐