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导致。所以可以将隐式转换为显示调用
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 文件创建服务示例
- Android 使用 aidl 文件创建服务示例
- Android 使用【AIDL】调用外部服务
- Android 使用【AIDL】调用外部服务
- Android笔记 使用AIDL和远程服务实现进程通信
- Android开发之使用AIDL和远程服务实现进程通信
- Android -- service 服务的创建与使用,生命周期,电话监控器
- Android 使用【AIDL】调用外部服务
- Android -- service 服务的创建与使用,生命周期
- Android 使用【AIDL】调用外部服务
- Android 使用AIDL调用外部服务
- Android--使用AIDL和远程服务实现线程通信
- Android中使用IntentService创建后台服务实例
- Android 使用【AIDL】调用外部服务
- [Android实例] Android 使用【AIDL】调用外部服务
- Android使用AIDL和远程服务实现进程通信
- Android 使用【AIDL】调用外部服务的解决方法
- Android创建Service后台常驻服务并使用Broadcast通信
- Android 使用【AIDL】调用外部服务 .
- Android 使用【AIDL】调用外部服务