AIDL的使用

我们可以使用AIDL来实现跨进程的方法调用,在上一个博客中我们介绍了binder的概念,在binder的基础上我们可以更加容易的理解AIDL。这里先介绍使用aidl来进行进程间通信的流程,分为服务端和客户端两个方面。

  1. 服务端

服务端首先要创建一个service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后再service中实现这个AIDL接口即可。

  1. 客户端

客户端所要做的事情就稍微简单一些,首先需要绑定服务端的setvice,绑定成功后,将服务端返回的binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。

上述只是一个感性的过程,AIDL的实现过程远不止这么简单,接下来会对其中的细节和难点进行详细介绍。

3.AIDL接口的创建

   首先看AIDL接口的创建,如下所示,我们创建了一个后缀为AIDL的文件,在里面生命了一个接口和两个接口方法。

// IbookManager.aidl
package com.dzx.recyclerviewdemo.aidl;// Declare any non-default types here with import statements
import com.dzx.recyclerviewdemo.aidl.Book;
interface IbookManager {/*** 除了基本数据类型,其他类型的参数都需要标上方向类型:in(输入), out(输出), inout(输入输出)*/void addBook(in Book book);List<Book> getBookList();
}

在AIDL文件中,并不是所有的数据类型都是可以使用的,那么到底AIDL文件支持哪些数据类型呢?

共 4 种:

  1. Java 的基本数据类型
  2. List 和 Map 
    • 元素必须是 AIDL 支持的数据类型
    • Server 端具体的类里则必须是 ArrayList 或者 HashMap
  3. 其他 AIDL 生成的接口
  4. 实现 Parcelable 的实体

其中自定义的parcelable对象和AIDL对象必须要显式import进来,不管他们是否和当前的AIDL文件位于同一个包内。

另外一个需要注意的地方是,如果AIDL文件中用到了自定义的parcelable对象,那么必须新建一个和他同名的AIDL文件并在其中生命他为parcelable类型。在上面ibookmanager中,我们用到了book这个类,所以,必须要创建爱你book.aidl,如下

package com.dzx.recyclerviewdemo.aidl;
//还要和声明的实体类在一个包里,同时注意不要新建aidl文件,因为你会发现,新建不了,
//提示你名称唯一,此时你新建一个file,名字为Person.aidl就可以,需要特别注意下
parcelable Book;

然后还有一个实现了parcelable的book。java类,如下:

package com.dzx.recyclerviewdemo.aidl;import android.os.Parcel;
import android.os.Parcelable;/*** Created by Administrator on 2018/8/14 0014.*/public class Book implements Parcelable{public int bookId;public String bookName;public Book(int bookId, String bookName) {this.bookId = bookId;this.bookName = bookName;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(bookId);dest.writeString(bookName);}public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {@Overridepublic Book createFromParcel(Parcel source) {return new Book(source);}@Overridepublic Book[] newArray(int size) {return new Book[size];}};private Book(Parcel parcel){bookId = parcel.readInt();bookName = parcel.readString();}
}

4.远程服务端service的实现

上面讲述了如何定义AIDL接口,接下来我们就需要实现这个接口了,我们创建一个MyAidlService,的service,代码如下:

public class MyAidlService extends Service {private static final String TAG = "MyAidlService";private CopyOnWriteArrayList<Book> mBooks;private IBinder mIbinder = new IbookManager.Stub(){@Overridepublic void addBook(Book book) throws RemoteException {Log.e("sssssssssssssss", "ssssssssaddBook" );mBooks.add(book);}@Overridepublic List<Book> getBookList() throws RemoteException {return mBooks;}};@Nullable@Overridepublic IBinder onBind(Intent intent) {mBooks = new CopyOnWriteArrayList<>();Log.e("sssssssssss", "ssssssssonBind" );return mIbinder;}@Overridepublic void onCreate() {super.onCreate();Log.e("sssssssssss", "onDestroy" );}@Overridepublic void onDestroy() {super.onDestroy();Log.e("sssssssssss", "onDestroy" );}
}

上面这主要看getbooklist和addBook这两个aidl方法的实现,实现过程也比较简单,注意这里采用了CopyOnWriteArrayList,在前面我们提到,AIDL方法啊是在服务端的binder线程池中执行的,因此当多个客户端同时连接的时候,会存在多个线程同时访问的情形,所以我们要子啊AIDL方法中处理线程同步,所以会用到CopyOnWriteArrayList来进行自动的线程同步。

然后我们需要在XML中注册这个service,注意此service是运行在独立进程中的,它和客户端的activity不在同一个进程中,这样就构成了进程间通信的场景:

  <serviceandroid:name=".MyAidlService"android:enabled="true"android:exported="true"android:process=":aidl"/>

客户端

客户端实现首先要绑定远程服务,绑定成功后将服务端返回的binder赌侠ing转成AIDL接口,然后就可以通过这个接口去调用服务端的远程方法了,代码如下:

public class MainActivity extends AppCompatActivity {private List<String>list;private IbookManager ibookManager;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {ibookManager = IbookManager.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(MainActivity.this,MyAidlService.class);bindService(intent,connection, Service.BIND_AUTO_CREATE);startService(intent);TextView tv = (TextView)findViewById(R.id.tv);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Book book = new Book(1,"android");try {ibookManager.addBook(book);List<Book>mList = ibookManager.getBookList();Log.e("sssss","ssssssss mlist = "+mList.toString());} catch (RemoteException e) {e.printStackTrace();}}});}}

其实大家看起来跟同进程的没啥区别  但是这是多进程的跨进程通信,希望大家了解

android开发艺术探索3:IPC--AIDL(跨进程)的使用相关推荐

  1. Android开发艺术探索笔记

    <Android开发艺术探索>这本书在几年前就已经买了,陆陆续续看过几次,都没有看完,没有理解透. 最近重读<Android开发艺术探索>,读了两次,第一次读完感觉还有大量的知 ...

  2. Android开发艺术探索--第二章IPC机制(2)之Binder

    最近在拜读任主席的Android开发艺术探索,现在看了一半,再回头看前面的,感觉跟没有看一样,所以还是把知识点总结一下吧,这一节咱们来讲一下IPC中的Binder 直观来说,Binder是Androi ...

  3. 《android开发艺术探索》读书笔记(二)--IPC机制

    接上篇<android开发艺术探索>读书笔记(一) No1: 在android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:process ...

  4. Android开发艺术探索读书笔记(一)

    首先向各位严重推荐主席这本书<Android开发艺术探索>. 再感谢主席邀请写这篇读书笔记 + 书评.书已经完整的翻完一遍了,但是还没有细致的品读并run代码,最近有时间正好系统的把整本书 ...

  5. Android开发艺术探索2

    Android开发艺术探索2 该系列文章为<Android开发艺术探索>读书笔记,仅作为学记录,勿喷. Android IPC简介 IPC是Inter-Process Communicat ...

  6. 《Android 开发艺术探索》笔记2--IPC机制

    <Android 开发艺术探索>笔记2--IPC机制 思维导图 Android IPC简介 Android中的多进程的模式 IPC基础概念 Serializable接口 Parcelabl ...

  7. Android 开发艺术探索 看不懂对着书敲慢慢理解,设计模式之禅总结,平时记录的笔记,3w多次字防止丢失,留存。

    知识点1: 1.子线程为什么不允许访问ui因为android中的ui控件不是线程安全的. 2.为什么不给Ui加上锁的机制,第一点 会让ui访问的逻辑变得复杂,其次降低ui访问的效率. 3.List转化 ...

  8. 《android开发艺术探索》读书笔记(五)--RemoteViews

    接上篇<android开发艺术探索>读书笔记(四)--View工作原理 No1: RemoteViews使用场景:通知栏和桌面小部件 No2: 通知栏主要通过NotificationMan ...

  9. Android开发艺术探索——新的征程,程序人生路漫漫!

    Android开发艺术探索--新的征程,程序人生路漫漫! 偶尔写点东西分享,但是我还是比较喜欢写笔记,看书,群英传看完了,是学到了点东西,开始看这本更加深入Android的书籍了,不知道适不适合自己, ...

  10. 《Android开发艺术探索》图书勘误

    第一章 在13页提到"系统只在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据,其他情况不会触发这个 ...

最新文章

  1. Sound Forge Pro 3使用教程
  2. AFAB折旧运行的几种情况
  3. 【Unity3D】Tags和Layers
  4. [已解决]fdfs-client-py==1.2.6安装失败
  5. 企业微信H5_网页jssdk调用,ticket签名config及示例
  6. Python 线程障碍对象 Barrier - Python零基础入门教程
  7. 米线店结账程序 装饰着模式_云南大学《设计模式》实验报告2_装饰者模式.doc...
  8. 示波器使用方法,正确使用示波器
  9. 博世如何通过创新加速成功孵化出人工智能养虾初创公司?
  10. FeedDemon,浏览Blog的好工具
  11. Java内存模型知识点小结---《深入理解Java内存模型》(程晓明)读书总结
  12. Ubuntu 21 .1安装wps office 2019并解决字体缺失问题教程
  13. 系统错误计算机中丢失文件,电脑文件丢失了怎么办?电脑文件丢失原因以及解决方法都在这了!...
  14. 如何解决商品秒杀超卖问题
  15. python笔试题110题_吐血整理:110道python面试题(带答案)
  16. oracle 结果集已耗尽_java.sql.SQLException: 结果集已耗尽,解决方法!
  17. 脏读(dirty read)不可重复读(unrepeatable read)幻读(phantom problem)解析
  18. 【精选实践】爱奇艺实用数据库选型树:不同场景如何快速选择数据库?
  19. 莲:什么?朕的大清亡了?
  20. 10, excel vba 修改单元格的颜色

热门文章

  1. 软考中级软件设计师--下午题
  2. Pycharm如何将项目部署到树莓派上?
  3. 梯度下降——雏凤清于老凤声
  4. python_day10のPython操作 RabbitMQ、Redis、Memcache
  5. 伪元素学习包含::before、::after的用法
  6. 怎样查询自己正在上网的路由器的IP地址?网络节点跟踪命令tracert的用法
  7. 鲁毅智权力交接:对AMD的影响还将继续
  8. Node.js Buffer
  9. Excel中文本的拆分与合并
  10. 用户 '****' 登录失败