最近做项目遇到一个问题,要通过我们的主应用给第三方应用发消息。至此接触到了AIDL。经过一番研究,终于懂了该怎么用了。在这里记录下来,一边后续继续了解

其中许多知识点都是参考http://www.poemcode.net/2010/05/aidl-ipc/

  AIDL——android接口定义语言。它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。

  要使用AIDL实现不同应用之间的通信,则主要部分就是实现.aidl文件。

1、实现.aidl文件 IMessage

package com.wyy.aidl;interface IMessage{String getMessage();
}

aidl文件里就是主要是写接口,就是要进行通信的方法。

  aidl文件里的代码跟java代码很类似,但也有许多不同之处。aidl文件里定义的接口不要有修饰符(如public  private等)。

AIDL 支持的数据类型划分为四类,第一类是 Java 编程语言中的基本类型,第二类包括 String、List、Map 和 CharSequence,第三类是其他 AIDL 生成的 interface,第四类是实现了 Parcelable protocol 的自定义类。

其中,除了第一类外,其他三类在使用时均需要特别小心。

使用第二类时,首先需要明白这些类不需要 import,是内嵌的。其次注意在使用 List 和 Map 此二者容器类时,需注意其元素必须得是 AIDL 支持的数据类型,List 可支持泛型,但是 Map 不支持,同时另外一端负责接收的具体的类里则必须是 ArrayList 和 HashMap

使用第三、四类时,需要留意它们都是需要 import 的,但是前者传递时,传递的是 reference,而后者则是 value。

在创建 .aidl 文件的过程中,应该注意一旦 method 有参数,则需注意在前面加上 in, out 或 inout,它们被称为 directional tag,但是对于基本类型的参数,默认就是 in,并且不会是其他值。

2、实现interface

  AIDL 为你生成一个 interface 文件,文件名称和 .aidl 文件相同。如果使用 Eclipse 插件,则 AIDL 会在构建过程中自动运行,如果不使用插件,则需要先使用 AIDL。

生成的 interface 会包含一个抽象内部类 Stub,它声明了在 .aidl 文件里的所有方法。Stub 也定义了一些帮助方法,比较常用的有 asInterface(),其接收一个 IBinder 作为参数,并且返回一个 interface 的实例用来调用IPC方法。
  
要实现aidl里定义的接口,就需要了解service,新建一个项目作为service端,在service里实现Imessage.stub

public class MyService extends Service {private IBinder mIbinder = new MyBinder();@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn mIbinder;}public String getS(){return  "从服务端获得的消息内容";}private class MyBinder extends IMessage.Stub{@Overridepublic String getMessage() throws RemoteException {// TODO Auto-generated method stubreturn getS();}}
}

这个环节是重中之重,需要特别小心的有两点,其一是抛出的所有异常均不会发给调用者;其二是IPC调用是同步的,这意味IPC服务一旦花费较长时间完成的话,就会引起ANR,应该将这样的操作放在单独的线程里。

3、向客户端公开 Interface

  

public class MainActivity extends Activity {private TextView tv1;private MyConnection con = new MyConnection();MyBroadCastReceive myReceiver = new MyBroadCastReceive();private IMessage message;Intent it;DemoBService service1 = new DemoBService();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv1 = (TextView) findViewById(R.id.tv1);        Intent service = new Intent("com.wyy.aidl.myservice");if(bindService(service, con, BIND_AUTO_CREATE)){Log.i("Mainactivity", "绑定成功");}
        }private class MyConnection implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubLog.i("MyConnection--onServiceConnected()", "message != null");message = IMessage.Stub.asInterface(service);
//在这里对获取到的信息进行操作  Log.i("MyConnection--onServiceConnected()", message.);

        }@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubLog.i("MyConnection--onServiceDisconnected()", "message ========= null");message = null;}}    }

  

  

转载于:https://www.cnblogs.com/yuanyuan-5683/p/aidl.html

AIDL实现不同应用间的通信相关推荐

  1. Android 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...

  2. 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通 ...

  3. Android开发之Service通过Messenger实现线程间的通信

    Messenger信使其实在真正使用中用到的并不多,但是面试的时候考官还是十分想要考察一下你的基本功的.那我们现在先来看一下Messenger的使用场景.如果你需要你的Service与远程线程通信,那 ...

  4. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

  5. 同步线程和进程间的通信

    最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了== 这里面有好几个互斥对象使用线程的 1 void mListText(CString str) 2 { 3 m_list_ ...

  6. Java 多线程(七) 线程间的通信

    Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...

  7. 线程间的通信 共享数据安全问题

    1 //线程间的通信:线程的任务不同,但是线程操作的数据相同. 2 3 //描述数据 4 class Resource 5 { 6 public String name; 7 public Strin ...

  8. java http连接_Java中通过方法创建一个http连接并请求(服务器间进行通信)

    服务器间进行通信只能通过流(Stream)的方式进行,不能用方法的返回值. 1.Java代码创建一个连接并请求该连接返回的数据 doGet()方法,execute()方法中调用 package dem ...

  9. 三层交换机解决不同VLAN间的通信—Vecloud微云

    交换机的转发过程 交换机工作于OSI参考模型的第二层,即数据链路层.交换机内部的CPU会在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表.交换机根据MAC地址表转发数据. 路由器的转 ...

最新文章

  1. CentOS6.2解决passwd: Authentication token manipulation error报错
  2. EF-CodeFirst-域模型配置
  3. mysql 5.764_RHEL5.764位源码编译安装MySQL-5.5.42遇到的问题
  4. 华为云大咖说-庄表伟:架构师的基本功——管理篇
  5. 在windows下编译ffmpeg
  6. Distances to Zero CodeForces - 803B (二分)
  7. 如何成为一名优秀的初级开发者?
  8. java runtime 清屏_【图片】请问java编写中如何做到清屏啊。。。_java吧_百度贴吧...
  9. Hive 动态分区入门
  10. 读论文 + 总结 + 笔记
  11. 领域驱动(自己理解)
  12. 在讯用矿物质防火电缆时应该注意什么?
  13. python删除重复文件
  14. OS学习笔记-15(清华大学慕课)处理机调度
  15. 文科妹子都会用 GitHub,你这个工科生还等什么
  16. 免费在线生成二维码网站,支持二维码自定义
  17. 木板切割问题(二)——动态规划
  18. sharepoint 2013 文档库eventhandle权限控制
  19. maven项目test执行main找不到资源文件
  20. ode45 求常微分非线性方程

热门文章

  1. vnpy学习10_常见坑
  2. Logistic逻辑回归总结
  3. 从数据平台到报表开发,我靠这个零代码报表工具,转行后月薪3W
  4. 地产IT人福利:帆软地产BI解决方案全解析
  5. 小白学习使用gitee问题产生汇总(持续更新)
  6. python3线程池爬虫_python3多线程爬虫中如何变量?
  7. 云终端linux,云终端详细介绍,看完你就都懂了
  8. vue监听用户在页面的浏览时间需在beforeDestroy()里面进行销毁
  9. python 字符集utf-8|精简版(三分钟了解)
  10. 睡觉觉睡觉睡觉计算机手机,睡够8小时才算好?科学告诉你,该睡多久!