2019独角兽企业重金招聘Python工程师标准>>>

AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

【一】AIDL文件的创建:

AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。

     其中对于Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。 而如果需要在AIDL中使用其他AIDL接口类型,需要import,即使是在相同包结构下。AIDL允许传递实现Parcelable接口的类,需要import. 
     需要特别注意的是, 对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。

AIDL只支持接口方法,不能公开static变量。

其中AIDL的方法还提供了oneway这个关键字,可以用关键字oneway来标明远程调用的行为属性,使用了该关键字,那么远程调用将仅仅是调用所需的数据传输过来并立即返回,而不会等待结果的返回,也即是说不会阻塞远程线程的运行。AIDL接口将最终将获得一个从Binder线程池中产生的调用(和普通的远程调用类似)。如果关键字oneway在本地调用中被使用,将不会对函数调用有任何影响。

1.服务端接口的创建:

package com.liusl.aidl;
import com.liusl.aidl.AIDLCallback;
interface ServiceAIDL {void registerClient(AIDLCallback cb);void unregisterClient(AIDLCallback cb);int add(int i, int j);int sum(in int[] numbers);
}

2.回调接口的创建:

package com.liusl.aidl;interface AIDLCallback {int returnResult(int result);
}

【二】服务端接口的实现:

将AIDLCallback作为服务端给客户端的回调,这样才实现了服务端和客户端的通信。同时使服务端继承service类,实现onBind方法,创建AIDLService对象,这样才能将服务端的接口提供给客户端进行调用。

package com.liusl.aidl;import com.liusl.aidl.AIDLCallback;
import com.liusl.aidl.ServiceAIDL;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;public class MyAIDLService extends Service {public final String TAG = "[service]";int sum = 0;@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "[MyAIDLService] onBind(intent)...");return (IBinder) new ServiceAIDLImpl();}class ServiceAIDLImpl extends ServiceAIDL.Stub {private AIDLCallback cb;@Overridepublic void registerClient(AIDLCallback cb) throws RemoteException {      this.cb = cb;Log.i(TAG, "[ServiceAIDLImpl] registerClient start...");cb.asBinder().linkToDeath(new DeathRecipient() {@Overridepublic void binderDied() {try {Log.i(TAG, "[ServiceAIDLImpl]binderDied.");} catch (Throwable e) {}}}, 0);Log.i(TAG, "[ServiceAIDLImpl] registerClient end...");}@Overridepublic void unregisterClient(AIDLCallback cb) throws RemoteException {}@Overridepublic int add(int i, int j) throws RemoteException {sum = 0;sum = i + j;cb.returnResult(sum);return 0;}@Overridepublic int sum(int[] numbers) throws RemoteException {sum = 0;for (int i = 0; i < numbers.length; i++) {sum += numbers[i];}cb.returnResult(sum);return 0;}}
}

【三】服务的创建及Activity的实现:

在客户端使用服务端的AIDL前,需要先通过创建一个客户端与服务端的连接,步骤如下:

1.创建intent:

String actionName = "com.liusl.aidl.MyAIDLService";

Intent intent = new Intent(actionName)

2.实现一个MyServiceConnection类,继承ServiceConnection,重写onServiceConnected和onServiceDisConnected方法。

3.新建了BindService对象:

MyServiceConnection connection = new MyServiceConnection();

通过调用bindService(intent, connection, Context.BIND_AUTO_CREATE);->onServiceConnected(),在OnServiceConnected()中获取服务端得aidl对象,

myservice = (ServiceAIDL) ServiceAIDL.Stub.asInterface(service);

4.实现客户端的AIDLCallback接口:

private class AIDLCallbackImpl extends AIDLCallback.Stub {public int returnResult(int result) {textView.setText("Result :" + result);return result;}}

5.通过服务端的aidl对象调用服务端的注册方法以及其他的方法:

myservice.registerClient(callBack);

myservice.add(2, 3);

由此就完成了客户端注册一个客户到服务端并且调用服务端的add方法,服务端将add的结果反馈给回调方法,客户端在接收到回调传来的值后进行显示操作。

注意:需要在AndroidMainFest.xml中对服务进行注册:

<service android:name="com.liusl.aidl.MyAIDLService"><intent-filter><action android:name="com.liusl.aidl.MyAIDLService"/></intent-filter></service>

代码所在位置:

http://www.oschina.net/code/snippet_1051613_22116

转载于:https://my.oschina.net/hiliusl/blog/137384

Android AIDL的实现相关推荐

  1. Android AIDL使用介绍(3) 浅说AIDL背后的Binder

    1.背景 在前面的博客中,我们已经学会了使用AIDL进行跨进程通信,AIDL的使用比较简单,可实际上跨进程通信是一个相当复杂的过程,例如进程A是怎么找到进程B的,如果有一个进程C冒充进程A,进程B又该 ...

  2. Android AIDL使用介绍(2)自定义数据类型的传递

    1.背景 默认情况下,AIDL只支持下列数据类型: Java八种基础数据类型(如 int.long.char.boolean 等); String字符串: CharSequence字符序列: List ...

  3. Android AIDL使用详解

    一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来 ...

  4. ANDROID AIDL 1

    也可参考:http://buaadallas.blog.51cto.com/399160/372090 的Android AIDL(Android Interface Definition Langu ...

  5. (转载)你真的理解Android AIDL中的in,out,inout么?

    前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了--或者并没有,但所占篇幅甚小,且基本上都是 ...

  6. Android Aidl (一)通过实例初探Aidl

    在Android的应用开发过程中,遇到与Service进行通信时,会使用Aidl.那到底Aidl是什么?Aidl的优势是什么?实现的原理是怎么样的? 习惯从例子入手,从实际应用加深对知识点的了解.我们 ...

  7. 猿创征文 | Android AIDL 学习笔记——学以致用

    文章目录 Android AIDL 跨进程通信 AIDL文件 AIDL语法 数据类型 关键字 引用 指定方法ID 总结 实现接口 获取AIDL对象 捕获异常 创建Parcelable对象 带Bundl ...

  8. android aidl权限,Android AIDL

    Android AIDL Android系统中,各应用程序运行在各自的进程中,无法直接进行交互.为了实现进程间的通讯(IPC),Android提供了AIDL Server方法进行处理. AIDL(an ...

  9. android AIDL IPC深入分析

    深入分析AIDL原理 博客分类: Android 在上一篇文章(Service使用方式)中,介绍了Android进程间通信(IPC)的使用,并给出了一个示例.但并没有深入分析aidl是怎样可以做到进程 ...

  10. android aidl接口初步了解

    2019独角兽企业重金招聘Python工程师标准>>> //app类package com.qudoulicai.www.aidltest;import android.conten ...

最新文章

  1. python中用来捕获异常的是_python – 在一行中捕获多个异常(块除外)
  2. IT-标准化(中国)有限公司-网络拓朴图
  3. 找不到类型{0} 它在 ServiceHost 指令中提供为 Service 特性值
  4. C# Keywords - as
  5. 清华大学大数据研究中心成立
  6. python 朋友圈自动回复评论_Python自动回复微信好友新年祝福
  7. mysql win linux性能对比,不同系统上 MySQL 的性能对比
  8. JS Math方法、逻辑
  9. 卡巴斯基安全浏览器_知名安全软件耍流氓!擅自监控用户,双十一绝不应该成为流氓软件的狂欢!...
  10. dns性能测试软件,开源dns软件之-mydns和bind性能测试与比较
  11. 黑苹果开机界面的启动项设置
  12. word在试图打开文件时遇到错误,解决办法
  13. android 控件发光_Android自定义View之边框文字、闪烁发光文字
  14. 易捷行云新一代私有云全场景智能统一运维|轻运维之场景化运维
  15. 计算机怎么样保存文件,电脑怎样保存表格文件
  16. matlab 双峰,如何在MATLAB中区分双峰和单峰阵列?
  17. SSL/TLS 通信过程
  18. Android语音通话实现方案及相关技术介绍
  19. Java实例-查找数组中的重复元素
  20. 中国500强企业 | 双胞胎集团携手契约锁共建电子签章系统

热门文章

  1. 单例模式的几种实现方式
  2. 2017年秋季个人阅读计划
  3. Java多线程之线程并发库阻塞队列的应用
  4. 【原创】新手入门一篇就够:从零开发移动端IM
  5. Java基础学习网站收藏
  6. zen-cart首页能否在中间栏显示“所有商品”?
  7. 用于弹出ModalDialog进行数据选择的控件
  8. 你这种直来直去的英语,买家受不了
  9. 为什么停车类APP看似缺口巨大却没有成长起来?
  10. 百万级微信服务号如何做活动运营和用户运营?