Learn && Live
虚度年华浮萍于世,勤学善思至死不渝
前言
Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/qaPOd,话不多说我们马上开始!
本篇参考了《Android开发艺术探索》和博客https://blog.csdn.net/luoyanglizi/article/details/51980630
概述
全称Android Interface Definition Language,Android接口定义语言,可利用该语言定义客户端和服务端均认可的编程接口,以便二者使用IPC进行相互通信
语法
(1)文件类型:后缀为.aidl的文件
(2)数据类型
-
八大基本数据类型
-
String和CharSequence
-
List:仅支持ArrayList,其内元素必须是AIDL支持的数据类型
-
Map:仅支持HashMap,其内元素必须是AIDL支持的数据类型,包括key和value
-
Parcelable:所有实现了Parcelable接口的对象,此时注意必须新建一个和它同名的AIDL文件,并在其中声明它为parcelable类型
// Book.java class Book implements Parcelable { } // Book.aidl package com.connor.aidl; parcelable Book; ...
-
AIDL:所有的AIDL接口
(3)定向tag,AIDL中除了基本数据类型,其它类型的参数必须标注,用于定义AIDL数据流向的参数
-
in:输入型参数,表示数据只能由客户端流向服务端,服务端可以收到数据,但客户端的数据不会因为服务端的数据的修改而变化
-
out:输出型参数,表示数据只能由服务端流向客户端,服务端会接收到数据的null,但服务端数据的修改,客户端数据同步修改
-
inout:输入输出型参数,表示数据可在服务端与客户端之间双向流通,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动
另外,Java 中的基本类型和 String ,CharSequence 的定向 tag 默认且只能是 in 。还有,请注意,请不要滥用定向 tag ,而是要根据需要选取合适的
(4)两种AIDL文件
- 定义parcelable对象
- 定义方法接口,以供系统使用来完成跨进程通信的。
使用AIDL实现IPC
1.服务端
(1)创建Service监听客户端的连接请求
(2)创建AIDL文件,声明暴露给客户端的接口
(3)在Service中实现这个AIDL接口
// (1)
public class BookManagerService extends Service {
private CopyOnWriteArrayList<Book> mBookList = new CopyOnWriteArrayList<Book>();
// (3)
private Binder mBinder = new IBookManager.Stub() {
@Override
public List<Book> getBookList() throws RemoteException {
return mBookList;
}
@Override
public void addBook(Book book) throws RemoteException {
mBookList.add(Book);
}
};
@Override
public void onCreate() {
super.onCreate();
mBookList.add(new Book(1, "Android"));
mBookList.add(new Book(2, "IOS"));
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
// Book.aidl
// 第一类AIDL文件
// 这个文件的作用是引入了一个序列化对象 Book 供其他的AIDL文件使用
// 注意:Book.aidl与Book.java的包名应当是一样的
package com.connor.aidl;
// 注意parcelable是小写
parcelable Book;
// BookManager.aidl
// (2)
package com.connor.aidl;
import com.connor.aidl.Book;
interface IBookManager {
List<Book> getBookList();
void addBook(in Book book);
}
// 独立进程,与应用跨进程通信
<service android:name=".aidl.BookManagerService"
android:process=":remote">
</service>
2.客户端
(1)绑定服务端的Service
(2)将服务端返回的Binder对象转成AIDL接口所属的类型
(3)调用AIDL中的方法
public class BookManagerActivity extends Activity {
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// (2)
IBookManager bookManager = IBookManager.Stub.asInterface(service);
try {
// (3)
List<Book> list = bookManager.getBookList();
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void onServiceDisconnected(ComponentName className) {}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_manager);
Intent intent = new Intent(this, BookManagerService.class);
// (1)
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(mConnection);
super.onDestroy();
}
}