AIDL
官网定义
AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似。 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。 在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。 编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。

支持类型
Java基本数据类型(int,long,char,boolean,float,double等);
CharSequence,String
实现Parcelable的对象
List和Map(元素必须是以上支持的数据类型,生成方法使用List和Map,接受端实际类型为ArrayList和HashMap)
AIDL
实现
实现Parcelable实体

要传递的实体类UserBean

public class UserBean implements Parcelable {
private String name;
private int age;
private String address;

public UserBean() {
}

public UserBean(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

protected UserBean(Parcel in) {
name = in.readString();
age = in.readInt();
address = in.readString();
}

public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {
@Override
public UserBean createFromParcel(Parcel in) {
return new UserBean(in);
}

@Override
public UserBean[] newArray(int size) {
return new UserBean[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(address);
}

/**
* 需要手动添加,Android Studio没法直接生成
*/
public void readFromParcel(Parcel reply) {
name = reply.readString();
age = reply.readInt();
address = reply.readString();
}

@Override
public String toString() {
return "UserBean{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
1
2
3
4
5
6
7
8
9
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
注: Android Studio中实现Parcelable设置完属性就能快速生成必要的代码,但是readFromParcel方法需要手动实现,否则无法编译通过会报错

Process 'command 'D:\software\android\sdk\build-tools\28.0.3\aidl.exe'' finished with non-zero exit value 1
1
AIDL文件

映射对象

// UserBean.aidl
package com.sjl.exercise.bean;

// Declare any non-default types here with import statements

parcelable UserBean;
1
2
3
4
5
6
接口aidl

注:

import声明任何非默认类型(例 UserBean)
方法中除了基本数据类型,其他类型的需要标上方向类型(in,out,inout)
// ICustomAidlInterface.aidl
package com.sjl.exercise;

// Declare any non-default types here with import statements
import com.sjl.exercise.bean.UserBean;

interface ICustomAidlInterface {
String getCurrentTime();

void insertUser(in UserBean userBean);

List<UserBean> getUsers();

void clearUser();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
定义完成后Make Project一下等待构建完成

服务端

创建远程服务

public class RemoteService extends Service {
private static final String TAG = "RemoteService";
private List<UserBean> list = new ArrayList<>();
ICustomAidlInterface.Stub stub = new ICustomAidlInterface.Stub() {

@Override
public String getCurrentTime() throws RemoteException {
return new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
}

@Override
public void insertUser(UserBean userBean) throws RemoteException {
list.add(userBean);
}

@Override
public List<UserBean> getUsers() throws RemoteException {
return list;
}

@Override
public void clearUser() throws RemoteException {
list.clear();
}
};

@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate");
Toast.makeText(this, "远程服务onCreate", Toast.LENGTH_SHORT).show();
}

/**
* 返回IBinder用于通信
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind");
Toast.makeText(this, "远程服务onBind", Toast.LENGTH_SHORT).show();
return stub;
}

@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG, "onUnbind");
Toast.makeText(this, "远程服务onUnbind", Toast.LENGTH_SHORT).show();
return super.onUnbind(intent);
}

@Override
public void onDestroy() {
Log.i(TAG, "onDestroy");
Toast.makeText(this, "远程服务onDestroy", Toast.LENGTH_SHORT).show();
super.onDestroy();
}
}
1
2
3
4
5
6
7
8
9
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
AndroidManifest.xml配置服务,定义Action用于隐式唤醒

<service
android:name=".module.service.remote.RemoteService"
android:enabled="true"
android:exported="true"
android:process=":remote">
<intent-filter>
<action android:name="com.sjl.aidl.remote" />
</intent-filter>
</service>
1
2
3
4
5
6
7
8
9
客户端

拷贝服务端的aidl文件及自定义的UserBean对象放到客户端的中,路径需要与服务端保持一致

绑定服务

Intent intent = new Intent();
//AndroidManifest.xml中定义的服务器端Action
intent.setAction("com.sjl.aidl.remote");
//5.0后无法通过隐式Intent绑定远程Service,需设置包名
intent.setPackage("com.sjl.exercise");
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
1
2
3
4
5
6
获取到AIDL接口

private ICustomAidlInterface iCustomAidlInterface;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iCustomAidlInterface = ICustomAidlInterface.Stub.asInterface(service);
Log.i(TAG, "onServiceConnected");
Toast.makeText(MainActivity.this, "service connected", Toast.LENGTH_SHORT).show();
}

@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "onServiceDisconnected");
iCustomAidlInterface = null;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
调用AIDL接口

iCustomAidlInterface.getCurrentTime();

UserBean userBean = new UserBean();
userBean.setName("name" + cnt);
userBean.setAddress("address" + cnt);
userBean.setAge(cnt);
iCustomAidlInterface.insertUser(userBean);

iCustomAidlInterface.getUsers();

iCustomAidlInterface.clearUser();
1
2
3
4
5
6
7
8
9
10
11
服务端
AIDL
UserBean

客户端
AIDL
UserBean
---------------------

【Android】进程间通信IPC——AIDL的更多相关文章

  1. Android进程间通信IPC

    一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...

  2. Android之IPC(aidl)

    IPC(Inter-Process Conmunication) 进程间通讯 在同一进程中,各个组件进行通信是十分方便的,普通的函数调用就可以解决:但是,对于处于不同进程中的组件来说,要进行通信,就需 ...

  3. 【Android】进程间通信IPC——Binder

    Binder是Android中的跨进程通信方式,bindService的时候,服务端返回Binder对象,通过该对象客户端可以从服务端获取数据.在进程间通信IPC——AIDL中创建了ICustomAi ...

  4. Android 进程间通信——AIDL

    代码地址如下:http://www.demodashi.com/demo/12321.html 原文地址:http://blog.csdn.net/vnanyesheshou/article/deta ...

  5. Android开发——进程间通信之AIDL(二)

    0.  前言 不论是Android还是其它操作系统.都会有自己的IPC机制.所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是非常不同的概念,线程是CP ...

  6. Android进程间通信-AIDL实现原理

    Android进程间通信基于Proxy(代理)与Stub(桩或存根)的设计模式(如图1-1所示).其中,Proxy将特殊性接口转换成通用性接口,Stub将通用性接口转换成特殊性接口,二者之间的数据转换 ...

  7. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信 ...

  8. Android之IPC机制

    Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...

  9. Android 中的AIDL,Parcelable和远程服务

    Android 中的AIDL,Parcelable和远程服务      早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用    ...

随机推荐

  1. 积木大赛 2013年NOIP全国联赛提高组

    题目描述 Description 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第i块积木的最终高度需要是hi.在搭建开 ...

  2. 洛谷 P1378 油滴扩展

    P1378 油滴扩展 题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完 ...

  3. Android---keycode值以及相应名称

    KEYCODE列表 电话键 键名 描写叙述 键值   KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_ME ...

  4. 升级DM5校验

    1,将某个文件生成带DM5的文件,使用srec_cat工具: read A   #原始文件 srec_cat $A -o 要生成的文件名称  -Line_Length 46 -Address_Leng ...

  5. 怎么修改tomcat端口

    tomcat默认的端口是8080,还会占用8005,8009和8443端口.如果已经启动了tomcat,再启动一个tomcat会发现这些端口已经被占用了,这个时候就需要修改端口号.   工具/原料   ...

  6. 王立平--java se的简单项目创建以及具体解释

    创建项目的简单步骤: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTUyNw==/font/5a6L5L2T/fontsize/400/ ...

  7. MySQL 日期时间函数大全 (转)

    转载自:http://blog.itpub.net/29773961/viewspace-1808967 以下内容基于MySQL 5.6及更高,大部分函数5.5也基本适用,更低版本请参考对应版本手册, ...

  8. 学习笔记——WPF

    WPF,Windows Presentation Foundation.主要作用在于界面呈现,但Presentation却是介绍的意思. WPF采用XAML + 代码相结合的方式,感觉跟ASP.NET ...

  9. K度限制MST poj 1639

    /* k度限制MST:有一个点的度<=k的MST poj 1639 要求1号点的度不超过k 求MST 我们先把1号点扔掉 跑MST 假设有sum个连通分支 然后把这sum个分支连到1上 就得到了 ...

  10. mysql数据库操作(3)

    1.在查询结果中不显示重复记录 查询时不显示重复记录主要应用了 DISTINCT 关键字,该关键字用于删除重复记录. 在实现查询操作时,如果查询的选择列表中包含一个表的主键,那么每个查询中的记录都将是 ...