博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何定义AIDL跨进程间通信
阅读量:5228 次
发布时间:2019-06-14

本文共 1699 字,大约阅读时间需要 5 分钟。

当进程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类。代码例如以下:

指定调用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类的内部类的对象。

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

转载于:https://www.cnblogs.com/mfrbuaa/p/4673456.html

你可能感兴趣的文章
深入理解《字符指针与字符数组真正的区别》
查看>>
青鸟资料下载
查看>>
基于visual Studio2013解决算法导论之012计数排序
查看>>
kinect for windows - DepthBasics-D2D详解之二
查看>>
JQuery写的一个简单的分页插件-2
查看>>
控制语句
查看>>
分布式ID生成器解决方案
查看>>
sql server nullif的使用技巧,除数为零的处理技巧
查看>>
python学习之元组
查看>>
http错误代码含义大全
查看>>
【BZOJ4864】神秘物质 [Splay]
查看>>
【bzoj题解】题解传送门
查看>>
WPF之DataGrid应用
查看>>
composer安装laravel下载不了
查看>>
项目显示页面思路(新手随笔)
查看>>
Linux的JCPU与PCPU区别
查看>>
TreeSet之定制排序和自然排序
查看>>
Wireshark网络抓包(二)——过滤器
查看>>
操作系统
查看>>
F08标准中Open命令的newunit选项
查看>>