您的位置:首页 > 移动开发 > Android开发

Android:AIDL服务创建与使用

2016-12-15 15:45 309 查看
一、什么是AIDL

Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。

为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。

二、创建AIDL服务的步骤

1、在工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。



在IServiceInterface(改名称随意)中,定义暴露给其他进程使用的方法。



2、ADT会自动生成一个Java接口文件(*.java)(gen目录下)。



IServiceInterface.java封装了调用远程服务的具体实现。具体代码后续分析(本篇主要学使用)

3、建立一个服务类(Service的子类),其他进程(应用)将远程调用的。



4、服务类中实现由.aidl文件生成的Java接口(抽象类IServiceInterface.Stub)。



5、在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。



三、调用AIDL服务

1、在java目录中创建与远程服务aidl文件所在包相同的包名的包



2、当前工程也会在gen目录自动生成IServiceInterface.java



3、接下来就是通过bindService与远程服务通信



实现bindService的回调ServiceConnection,并在回调(onServiceConnected)中拿到远程服务onBind返回的对象,并将改对象通过.aidl自动生成类的方法(IServiceInterface.Stub.asInterfac)转换成我们需要的远程服务对象的代理。



拿到代理对象后,就可以像调用本地方法一样调用远程服务的方法。



最后输出结果:



本地传2+3,然后服务端再次基础上+10,所以返回结果15.

四、java.lang.IllegalArgumentException: Service Intent must be explicit 异常处理,这是因为不能指定隐式intent导致。所以可以将隐式转换为显示调用

public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
if (resolveInfo == null || resolveInfo.size() != 1) {
return null;
}
ResolveInfo serviceInfo = resolveInfo.get(0);
String packageName = serviceInfo.serviceInfo.packageName;
String className = serviceInfo.serviceInfo.name;
ComponentName component = new ComponentName(packageName, className);
Intent explicitIntent = new Intent(implicitIntent);
explicitIntent.setComponent(component);
return explicitIntent;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android aidl explicit