Connor学Android - IPC方式之AIDL

在这里插入图片描述

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ConnorYan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值