AIDL概述

AIDL全称是“Android Interface Definition Language”,即Android的接口定义语言。AIDL用来协助开发者来处理进程间通信,我们知道可以使用Messenger完成进程间通信。但是Messenger每次调用都只能传递一个消息包,不能很好的完成一些复杂的调用,比如说我们想像API调用那样通过不同的方法来实现不同的动作,这时Messenger就难以实现了。所以Android引入了AIDL服务来完成这种RPC调用。

下面是在项目工程中运用AIDL的具体方法和步骤。

AIDL定义修改

普通方法

通过菜单“File”——“New”创建扩展名为aidl的文件,文件内容与interface接口格式类似(区别在于要在输入参数前面加上in关键字)。文件定义完成并且没有错误,则ADT会自动在gen目录下生成该aidl文件对应的java文件。下面是一个AIDL接口定义文件的例子:

[代码]java代码:1

2

3interface IUserService {

double multiply(in double a1, in double a2);

}

方法中传递了自定义数据结构

如果想在aidl方法中使用自定义数据结构,则需加上如下步骤:

1、把自定义数据结构的代码(如User.java)挪到aidl包下面,这个数据结构必须实现Parcelable接口;

2、在aidl包下新建一个User.aidl文件,文件内容为“parcelable User;”;很简单,告诉aidl,我这里有个叫做User的parcelable对象;

3、在aidl接口定义中添加新的方法,并使用import导入User的完整路径。即使User.java就在aidl目录下,那也得import,不然ADT不认这个对象;下面是补充后的文件定义例子:

[代码]java代码:1

2

3

4

5

6import com.example.exmprocess.aidl.data.User;

interface IUserService {

double multiply(in double a1, in double a2);

int save(in List userList);

}

项目代码修改

客户端代码修改

1、定义一个ServiceConnection对象,在onServiceConnected方法中获取对方服务的实例。代码例子如下:

[代码]java代码:01

02

03

04

05

06

07

08

09

10

11private IUserService mService;

private ServiceConnection mAidlConn = new ServiceConnection() {

public void onServiceConnected(ComponentName name, IBinder binder) {

mService   = IUserService.Stub.asInterface(binder);

}

public void onServiceDisconnected(ComponentName name) {

mService   = null;

}

};

2、远程服务当然只能通过bindService方法启动,不能通过startService方法启动。同时Intent对象也只能通过setAction来指定对方服务的动作,而不能直接指定对方服务的class;

3、绑定服务后,再调用aidl服务端,即可使用mService来调用相应的方法;

服务端代码修改

重写的Binder类要改为继承自Stub(原来继承自Binder),即ADT根据aidl文件定义自动生成的Stub类,查看自动生成的java源码,其实Stub类就是从Binder类派生出来的。

另外,服务端的Binder类需要实现aidl中定义的方法。

需要注意的地方

1、intent-filter节点中的“android:name”必须填入原始名称,不可用“@string/aaa”这种定义来代替。

2、Android5.0之后不能再隐式启动Service,只能显式启动Service,所以需要判断当前SDK版本从而做分支处理。

3、aidl定义文件需要同时加入到客户端项目代码与服务端项目代码中,并且aidl文件所在的包路径也要保持一致。

使用示例

下面是AIDL服务调用的效果图:

下面是AIDL客户端的示例代码:

[代码]java代码:01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Build;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

import com.example.exmprocess.R;

import com.example.exmprocess.aidl.data.IUserService;

import com.example.exmprocess.aidl.data.User;

import com.example.exmprocess.util.IntentUtil;

public class AidlActivity   extends Activity   implements OnClickListener   {

private static final String   TAG = "AidlActivity";

private String AIDL_SERVICE = "com.example.exmprocess.aidl.action.AIDL_ADD";

private TextView tv_aidl;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_aidl);

tv_aidl   = (TextView) findViewById(R.id.tv_aidl);

Button   btn_aidl_bind = (Button) findViewById(R.id.btn_aidl_bind);

Button   btn_aidl_unbind = (Button) findViewById(R.id.btn_aidl_unbind);

Button   btn_aidl_send = (Button) findViewById(R.id.btn_aidl_send);

btn_aidl_bind.setOnClickListener(this);

btn_aidl_unbind.setOnClickListener(this);

btn_aidl_send.setOnClickListener(this);

}

private IUserService mService;

private ServiceConnection mAidlConn = new ServiceConnection() {

public void onServiceConnected(ComponentName name, IBinder binder) {

mService   = IUserService.Stub.asInterface(binder);

}

public void onServiceDisconnected(ComponentName name) {

mService   = null;

}

};

@Override

public void onClick(View v) {

if (v.getId() == R.id.btn_aidl_bind) {

Intent   intent = new Intent();

intent.setAction(AIDL_SERVICE);

Intent   newIntent = intent;

//Android5.0之后不能再隐式启动Service,只能显式启动Service

if (Build.VERSION.SDK_INT >=   Build.VERSION_CODES.LOLLIPOP) {

newIntent   = new Intent(IntentUtil.getExplicitIntent(this,   intent));

}

boolean bBind = bindService(newIntent, mAidlConn,   Context.BIND_AUTO_CREATE);

Toast.makeText(this,   "绑定结果为"+bBind, Toast.LENGTH_LONG).show();

}   else if (v.getId() == R.id.btn_aidl_unbind)   {

unbindService(mAidlConn);

mService   = null;

}   else if (v.getId() == R.id.btn_aidl_send) {

if (mService == null) {

Toast.makeText(this,   "未绑定AIDL服务", Toast.LENGTH_LONG).show();

}   else {

try {

double a1 = 123;

double a2 = 9;

double result = mService.multiply(a1, a2);

List   userList = new ArrayList();

userList.add(new User(1, "张三", "111111"));

userList.add(new User(2, "李四", "999999"));

userList.add(new User(3, "王五", "123456"));

int count = mService.save(userList);

String   desc = String.format("%f*%f计算结果是%f\n本次保存了%d条记录",

a1,   a2, result, count);

tv_aidl.setText(desc);

}   catch (RemoteException   e) {

//   TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

下面是AIDL服务端的示例代码:

[代码]java代码:01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35import java.util.List;

import com.example.exmprocess.aidl.data.IUserService.Stub;

import com.example.exmprocess.aidl.data.User;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

public class AidlService   extends Service   {

private static final String   TAG = "AidlService";

private final IBinder mBinder = new LocalBinder();

public class LocalBinder extends Stub {

@Override

public double multiply(double a1, double a2) throws RemoteException {

return a1*a2;

}

@Override

public int save(List userList) throws RemoteException {

//此处省略保存操作

return userList.size();

}

}

@Override

public IBinder onBind(Intent intent) {

Log.d(TAG,   "onBind");

return mBinder;

}

}

JAVa调用aidl_远程接口调用AIDL相关推荐

  1. Hessian Binary Web Service Protocol远程接口调用入门

    摘要:Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二 ...

  2. RestTemplate远程接口调用

    spring rest mvc使用RestTemplate远程接口调用 主要代码如下: import java.util.HashMap;  import java.util.Map; import ...

  3. HttpClient远程接口调用-实名认证

    1.HttpClient远程接口调用 1)用户注册 注册按钮button提交表单时,要return false form表单 <!-- action="http://localhost ...

  4. java 金数据推送数据_基于JAVA的黄金数据接口调用代码实例

    代码描述:基于JAVA的黄金数据接口调用代码实例 接口地址:http://www.juhe.cn/docs/api/id/29 1.[代码][Java]代码 import java.io.Buffer ...

  5. 外汇汇率接口 java_基于java的货币汇率接口调用代码实例

    基于java的货币汇率接口调用代码实例 基于JAVA 的货币汇率接口调用代码实例 代码描述:基于JAVA 的货币汇率接口调用代码实例 代码平台:聚合数据 import java.io.Buffered ...

  6. java用代码实现星期菜谱_基于JAVA的菜谱大全接口调用代码实例

    基于JAVA的菜谱大全接口调用代码实例 代码描述:基于JA V A的菜谱大全接口调用代码实例 接口平台:聚合数据 import java.io.BufferedReader; import java. ...

  7. java实现基金浮动_基于JAVA的重仓股基金接口调用代码实例

    代码描述:基于JAVA的重仓股基金接口调用代码实例 关联数据:重仓股基金 接口地址:http://www.juhe.cn/docs/api/id/27 1.[代码][Java]代码 import ja ...

  8. JAVA爬电信_基于JAVA的电信基站接口调用代码实例

    代码描述:基于JAVA的电信基站接口调用代码实例 关联数据:电信基站 接口地址:http://www.juhe.cn/docs/api/id/16 1.[代码][Java]代码 import java ...

  9. JAVA 短信API接口调用 附 文档 Demo

    JAVA 短信API接口调用 附 文档 Demo 1.请求地址 http://host:port/sms 请求方式可以 POST 和 GET方式,建议采用POST方式 2.参数说明 参数需要 URLE ...

最新文章

  1. Windows平台使用Gitblit搭建Git服务器图文教程
  2. android 限制edittext 最大输入字符数
  3. [转]Android 代码混淆和加固 so库 简单教你一行代码实现
  4. php register_shutdown_function响应error 配合error_get_last 捕获错误
  5. 7nmarm微架构鲲鹏服务器芯片,中国电信服务器集采:同方鲲鹏服务器拿下6000万元份额...
  6. python索引右往左_左手用R右手Python系列5——数据切片与索引
  7. 梁肇新《编程高手箴言》书评
  8. php数据库插入表情转换,如何转义emoji表情,让它可以存入utf8的数据库?
  9. ap6212中串口蓝牙在linux下的使用记录
  10. 黑马程序员—银行调度系统
  11. 计算机毕业设计-基于springboot的社区志愿者管理系统
  12. 千万不要和女程序员做同事!否则你会爱上她
  13. 年产4000吨果味奶糖生产车间工艺设计
  14. Spring Cloud (五):路由网关(Zuul)
  15. c语言 | 求1000-2000年之间的闰年
  16. intellij idea 更换代码颜色(教程)
  17. XMind 常用快捷键(思维导图总结)
  18. 基于STM32的门禁系统源码分享
  19. URP/LWRP Shader实现描边效果
  20. 面试中java 知识点

热门文章

  1. 18个分形图形的GIF动画演示
  2. [buuctf]刷题记录web
  3. 台式计算机有乱码如何解决,台式机键盘输入乱码应该怎么解决
  4. 树莓派 NOOBS 安装系统
  5. 关于魔域游戏木马的设计问题
  6. tp6多应用模式隐藏路由中的应用名
  7. 新环境下互联网PMO的“锚点”︱腾讯金融科技平台PMO负责人邢国杰
  8. 【Shell编程之循环语句与函数】
  9. 这个春节,我一直在牵挂一个人
  10. Linux 设备总线驱动模型(转载)