如何定义AIDL跨进程间通信

简介:

当进程A要去调用进程B中的service时,并实现通信,我们通常都是通过AIDL来操作的

projectA

首先在我们自己的包com.wzp.aidlservice中创建一个RemoteService.aidl文件,在里面我们自己定义一个接口,含有方法getService()。ADT插件会在gen文件夹下自己主动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.Stub的内部类,该内部类中含有AIDL文件接口的getService()方法

比如:

package com.wzp.aidlservice;
interface RemoteService { 
     String getService(); 
}


说明一:AIDL文件的位置不固定,能够随意,还有不要在定义接口中使用修饰符(private,public这些)

接着,定义自己的MyService类,在MyService类中,定义一个内部类去继承RemoteService.Stub这个内部类。实现getService方法。在onBind方法中返回这个内部类的对象,系统会自己主动将这个对象封装成IBinder对象,传递给它的调用者。

比如:

public class MyService extends Service { 
	public class MyServiceImpl extends RometeService.Stub { 
		@Override 
		public String getService() throws RemoteException { 
			return "AIDL样例"; 
		} 
	} 
	@Override 
	public IBinder onBind(Intent intent) { 
		return new MyServiceImpl(); 
	}
}
在onBind方法一定要返回MyServiceImpl类的对象实例,不然调用者是获取不到服务对象的

然后,须要在AndroidManifest.xml文件里配置MyService类。代码例如以下:

<!-- 注冊服务 -->
<service android:name=".MyService">
  <intent-filter>
   <!-- 指定调用AIDL服务的ID  -->
      <action android:name="com.wzp.aidlservice.RemoteService"/>
   </intent-filter>
</service>

指定调用AIDL服务的ID是为了告诉外界(其它进程)MyService这个类可以被别的进程訪问。仅仅要别的进程知道这个ID,就行实现通信。即本例中。进程B可以找到进程A实现通信。

注意:AIDL并不须要权限


projectB

首先我们要将projectA中生成的RemoteService.java文件复制到projectB中。在bindService方法中绑定AIDL。服务绑定AIDL服务就是将RemoteService的ID作为intent的action參数。

说明:假设我们单独将RemoteService.aidl文件放在一个包里。那么在我们将gen文件夹下的该包复制到projectB中。假设我们将RemoteService.aidl文件和我们的其它类存放在一起。那么我们在projectB中就要建立对应的包,以保证RmoteService.java文件的包名正确,并且我们不能改动RemoteService.java文件

bindService(new Intent("com.wzp.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE);

ServiceConnection的onServiceConnected(ComponentName name,IBinder service)方法中的service參数就是projectA中MyService类中继承了RemoteService.Stub类的内部类的对象。



版权声明:本文博客原创文章。博客,未经同意,不得转载。








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4673456.html,如需转载请自行联系原作者


相关文章
|
资源调度 前端开发
React富文本编辑器wangEditor
React富文本编辑器wangEditor
403 0
|
JSON 前端开发 Java
Springboot中整合knife4j接口文档
Springboot中整合knife4j接口文档
1393 0
|
4月前
|
应用服务中间件 网络安全 nginx
配置Nginx以支持Websocket连接的方法。
通过上述配置,Nginx将能够理解WebSocket协议的特殊要求,代理Websocket流量到合适的后端服务器。注意,Websocket并不是HTTP,尽管它最初是通过HTTP请求启动的连接升级,因此保证Nginx了解并能够妥善处理这种升级流程是关键。
1079 10
|
Android开发
解決Android报错:Could not initialize class org.codehaus.groovy.reflection.ReflectionCache
解決Android报错:Could not initialize class org.codehaus.groovy.reflection.ReflectionCache
447 1
|
机器学习/深度学习 算法 网络安全
深度学习租gpu
深度学习租gpu
657 0
|
前端开发 定位技术 计算机视觉
3D激光SLAM:ALOAM---Ceres 优化部分及代码分析
通常一个优化器会帮助解决优化问题中大部分内容,但是残差的计算以及残差对优化变量的雅克比矩阵通常需要用户自己定义,而雅克比矩阵通常比较复杂,因此有的优化库如G2O,GTSAM会预先定义好一些常见的优化问题,所涉及的残差及雅克比计算方式,但是并不能覆盖所有场景,一旦有些问题不是优化器事先建模好的问题,那就需要用户自己去定义残差和雅克比矩阵的计算方式,这个会非常麻烦,而且容易出错.ceres通过引用自动求导的功能,无论什么优化问题,用户只需要定义残差的计算方式,自动求导功能会帮助用户计算对应的雅克比矩阵来实现优化问题的求解.
3D激光SLAM:ALOAM---Ceres 优化部分及代码分析
|
Java 测试技术 索引
Elasticsearch索引分片的数量及大小分配策略
Elasticsearch索引分片的数量及大小分配策略